正则表达式
前段时间人力姐姐遇到了难题,老板要求统计本月加班情况,要从飞书到处的文档中统计出每个人加班的天数和加班日期(每晚9:00之后算是加班,公司补贴30元),人工统计工作量很大,因此问我有没有好用的Excel筛选公式。我相信这个需求用Excel也是可以做的,可是我不会,所以就想用Python写个数据处理的脚本帮她统计一下,经过折腾实现了她要的功能。期间用到的主要技术点就是正则表达式筛选字符串,想到正则表达式是与编程语言无关的通用知识,因此更应该掌握,在此记录一下。
首先讲一下实现思路飞书导出的考勤统计表如下图所示,每列都是一个工作了,我们统计的加班情况就是工作日每天正常上班(10:00)之前,晚上9:00之后下班。表格中每行都是一位员工,每列是一天,因此第一层循环读取每位员工的出勤情况,第二层循环就是判断是否加班,实际上就是统计每个单元格是否包含字符串“正常(9:00-10:00),正常(21:00-次日4:00),这里定了一个规则最晚的下班时间为次日凌晨4:00(应该不会有卷王这么晚下班吧!),此时就需要正则表达式出场了。
首先是语言环境,为了快速开发选择的开发语言是Python,使用Anaconda + Pycharm的组合(之前就装的,并不是为了这个小任务单独装的)。另外还要安装一个读取excel的库xlrd,不得不说Anaconda创建虚拟环境安装Python包确实很方便,直接 pip install xlrd就可以,几乎不可能出错,在Windows环境下开发Python强烈安利,另外还要注意的是在Pycharm中选择”Python Interpreter“时要选择安装xlrd库的环境,怎么设置在此不赘述了(File->settings->Python Interpreter)。
首先导入Python库:
import xlrd #excel读取
import re #正则表达式
设计正则表达式匹配规则,以下就是匹配字符串”正常(0:00-9:59)“上班,正常*****,正常(21:00-23:59)"即9点后下班,因为不想写的太长所以分成两条规则,中间还有一些特殊情况比如正好10:00打卡上班、第二天凌晨之后打卡下班等等都单独设计了匹配规则,这些就不再展开了。这里用到的正则表达式语法有".","[]",""等,其他的语法用到时可以单独查。
reg1=r"正常.[0][0-9].[0-5][0-9].*正常" #正则表达式,0:00-9:59上班
reg2=r"正常.*正常.[2][1-3].[0-5][0-9]."#21:00-23:59下班
设计完正则表达式之后该怎么用呢?相信这也是许多人学完之后的疑惑,下面结合代码看:
for i in range(row):
counter=0
for j in range(col):
m = re.search(reg1, str(obj_sheet.cell_value(i, j)))
if(m is None):
m = re.search(reg2, str(obj_sheet.cell_value(i, j)))
if(m is not None ): #此时m.string就是包含加班时间的字符串
counter+=1
其实就是利用上面设计好的规则去search目标字符串,找到的话就会返回这个串,否则为None。之后利用这个信息可以统计,也可以做成明细给老板看了-_-!