查看原文
其他

妙用正则表达式--Python中的re模块

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪

文字编辑:余术玲

技术总编:张   邯



爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击文末阅读原文呦~

另外,2019年11月29日-12月1日,武汉字符串数据科技有限公司将在湖北武汉举办《第四期Python编程技术培训》招生即将结束,还有少量名额,感兴趣的同学可打开爬虫俱乐部往期推文——2019年Python第四期培训招生报名,不要错过机会哦! 



Python中的re模块可以方便地引入正则表达式。利用正则表达式,我们可以对文本内容进行精确快捷地匹配和提取。与Stata相比,正则表达式的元字符是通用的,不同的是函数。re库中有若干个函数各司其职,在上一篇推文《Python标准库re:正则表达式》中我们介绍了re库中的三个常用函数,现在小编将从实用的角度再介绍几个常用的函数。

首先,我们回顾一下re模块中有哪些属性和方法。

import re #引入该模块print(re.__all__) #查看re模块中的全部属性和方法

结果为:

['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']

上篇文章中我们讲解了matchsearchfindall函数,本文将继续讲解subsplitcompile函数。

re.sub( )
re.sub( )用于检索与替换特定字符串。其语法为:
re.sub( pattern, repl, string, count=0, flags=0 )

其中pattern是匹配要求(可以填正则表达式),repl是替换后的字符串,string是原始字符串,count是匹配后替换的最大次数,默认为0,表示替换全部。flags是正则表达式的匹配方式。

正则表达式修饰符如下表所示:

来看一个小例子

import re #引入re模块sentence ="This is is is is a island."print(re.sub('is','',sentence,2)) #把sentence中的前两个“is”替换为空

结果为:

Th  is is is a island.

结果中,单词“this”中的“is”和第一个单词“is”都被替换为空,但是单词“this”中的“is”并非我们真正想替换掉的,这时我们可以使用正则表达式来调用这个函数,加入单词边界符“\b”来达到匹配“is”的目的。

print(re.sub(r'\bis\b','',sentence,2)) #\b表示单词边界,也就是指单词和空格间的位置

结果如下:

This   is is a island.

可以看到,前两个 “is”被替换为空格。

我们利用flag中的忽略大小写可以实现如下替换,将字母”t”替换为空,不论大小写:

print(re.sub('t','',sentence,0,re.I))

结果如下:

his is is is is a island.

可见,文本中的大写字母”T”被替换为空。可见,re.I这一模式可以方便地用于不区分大小写英文字母的检索、匹配和替换。

re.split( )
re.split( )用于分割字符串,其语法为:

re.split(pattern , string [ , maxsplit=0, flags=0])

其中,pattern是分割要求(可以填正则表达式),string是要分割的字符串,maxsplit是分割次数,默认为0,表示全部分割。flags是正则表达式的匹配方式(见上表)。

运用re.split( ),我们可以把sentence按照空格来分割,得到一个单词列表,此处可以使用普通字符串匹配。

print(re.split(' ',sentence)) #按照空白字符分割sentence,全部分割

当然我们可以使用正则表达式实现相同的目的:

print(re.split(r'\s+',sentence))  #\s+ 表示匹配一个或多个空白符(\s表示匹配空白符,+表示重复1次或1次以上)

结果如下:

['This', 'is', 'is', 'is', 'is', 'a', 'island.']['This', 'is', 'is', 'is', 'is', 'a', 'island.']
re.compile( )
re.compile( )用于编译正则表达式,生成一个正则表达式对象,供matchsearchfindall等函数使用。
其语法是:compile(pattern[, flags=0])

其中,pattern是匹配要求(可以填正则表达式),flags是正则表达式的匹配方式(见上表)。可以用于pattern较多时,取不同的名字进行区分,或者同一个pattern需要反复调用时,与matchsearchfindall函数结合起来增强代码可读性,减少代码的长度。

实际应用

我们想要把下列email中的邮箱地址干净地提取出来,观察之后发现,目标信息的初始位置是“Email:”,终止位置是“.;”,所以我们编写一个正则表达式,用它来进行匹配。

email= "上海对外经贸大学金融管理学院;Email:zhonghuiyong@gmail.com.;Email:luming1973@sjtu.edu.cn.; 武汉大学经济与管理学院金融系;Email:manny@whu.edu.cn.;"pattern=re.compile(r'Email:(.+?)\.;')print(re.findall(pattern,email))

结果如下:

['zhonghuiyong@gmail.com', 'luming1973@sjtu.edu.cn', 'manny@whu.edu.cn']

另一种写法也可以:

print(pattern.findall(email))

结果如下:

['zhonghuiyong@gmail.com', 'luming1973@sjtu.edu.cn', 'manny@whu.edu.cn']

当然我们可以不使用compile函数,直接使用findall函数来提取:

print(re.findall(r'Email:(.+?)\.;',email))

结果与上面的方法相同:

['zhonghuiyong@gmail.com', 'luming1973@sjtu.edu.cn', 'manny@whu.edu.cn']

今天我们学习了另外三个函数以及与正则表达式的搭配使用。正则表达式基础概念不多,应用起来却花样迭出。一旦熟悉之后,我们就会在处理数据的过程中如鱼得水,得心应手。小伙伴们快用起来吧!


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐  

        豆瓣电影评分之数据爬取与可视化的实现   

为了辅导作业,这位家长竟然...

       走进列表的世界——列表方法(二)
走进列表的世界——列表方法(一)
朝花夕拾|长宽数据转换——reshape命令

Stata有音乐包啦!

对《陈情令》的数据可视化分析

stata绘制热力图详解

实战演练-明星微博热搜次数的数据可视化

《少年的你》影评

集合常用方法小结

实战演练-爬取深交所年报

重建“通天塔” —— Unicode编码与解码

输出分组描述性统计表的利器——report

字典常用操作小结

XPath Helper助XPath爬虫一臂之力

查找变量?用“codebook”!

distinct命令用法一览


关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存