通过Python正则匹配快速统计团购接龙数据

背景:疫情期间,社区团购太过火爆,微信接龙信息登记杂乱无序,手动整理非常费时,不便于后续汇总各居委楼栋订购量以安排配送。亲身经历——这两天团鸡蛋接龙接了将近2天……结束后志愿者处理统计数据到凌晨两点……我想python也许可以解决这个问题。

案例场景还原——

微信接龙原始数据填写存在的问题:
(1)信息缺失,漏行or重复录入。
(2)信息字段顺序个人填写不一致。
如A填:"X盒 XX弄XX室 姓名 手机"
B填“姓名 手机 X盒 XX弄XX室 ”,
填写信息顺序不一致的话,在excel中使用分列也很难处理
(3)填写格式不一致。
如“XX弄XX楼XX室” vs “XX-XX-XX”

Python数据处理——用正则匹配摘出字段信息,信息存入数据框再写入excel。

步骤1:将接龙后的纯文本以单列形式存储在文件input.xlsx的Sheet1中
步骤2:python读数据

import pandas as pd
infname='input.xlsx'
inputdata='Sheet1'
df=pd.read_excel(infname,inputdata,header=None)
df.columns=['line']
df.head(5)

步骤3:正则匹配地址、手机号码

import re
name=[]
addr=[]
addr1=[]
addr2=[]
addr3=[]
phone=[]
num=[]
for i in range(len(df.index)):
    line=str(df.loc[i,'line'])
    line=line[line.find('.')+1:]
    line=line.replace('一','1').replace('零','0').replace('O','0').replace('七','7')

    #手机号码匹配
    pattern1=re.compile(r'[1l][345789]\d{9}',re.X)
    phonetxt=''.join(pattern1.findall(line))
    phone.append(phonetxt)
    if len(phonetxt)==11:
        line=line.replace(phonetxt,'.')
    
    #数量匹配
    pattern2=re.compile(r'[\d]+(?:箱|盒)',re.X)
    numtxt=''.join(pattern2.findall(line))
    num.append(numtxt)   
    if len(numtxt)>=1:
        line=line.replace(numtxt,'')

    #昵称匹配
    line=re.sub(r'[\s+|,|,|.]+','.',line) 
    line=line.strip('.')
    nametxt=line[:line.find('.')]
    name.append(nametxt) 
        
    #地址匹配-弄号室
    line=re.sub(r'[栋|号楼]','号',line) 
    line=line.replace('弄-','弄').replace('号-','号')
    pattern3=re.compile(r'[\d]+(?:-|弄|号)',re.X)
    addrtxt2=''.join(pattern3.findall(line))
    addr2.append(addrtxt2.strip('-'))
    if len(addrtxt2)>=1:
        line=line.replace(addrtxt2.strip('-').strip('号'),'')    

    #地址匹配-室
    pattern4=re.compile(r'[号|-][\d]+',re.X)
    addrtxt3=''.join(pattern4.findall(line)).strip('号').strip('室').strip('-')
    addr3.append(addrtxt3)
    if len(addrtxt3)>=1:
        line=line.replace(addrtxt3,'')  
    
    #地址匹配-小区|路|公寓
    pattern5=re.compile(r'[\u4E00-\u9FA5]{2}(?:小区|路|大楼|公寓)',re.X)
    addrtxt1=''.join(pattern5.findall(line))
    addr1.append(addrtxt1)
    
df['姓名']=pd.Series(name)
df['区域']=pd.Series(addr1)
df['楼弄']=pd.Series(addr2)
df['室']=pd.Series(addr3)
df['手机号码']=pd.Series(phone)
df['数量']=pd.Series(num)
df.head(100)

处理后展示结果如下:

备注:line列为原始数据

步骤4:写入excel,生成一个output.xlsx的excel文件,名为output的sheet中存放着处理过的数据

outfname='output.xlsx'
outputdata='output'
writer=pd.ExcelWriter(outfname)
df.to_excel(writer,outputdata)
writer.save()

打开生成的excel查看结果如下,接着就可以按楼弄排序,让大家对照着核对最终信息(比如重复写了但是两次填写数量不一致的、没有写数量的之类),需要注意仅留一个人收口变更信息。后续派发的时候志愿者就可以根据楼栋集中配送了。

备注:line列为原始数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容