妙用正则表达式--Python中的re模块(二)
本文作者:王碧琪
文字编辑:钱梦璇
技术总编:张 邯
爬虫俱乐部将于2020年1月5日至11日在湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~
我们在往期推文(妙用正则表达式--Python中的re模块(一))当中介绍了re库的一些函数的用法,借用正则表达式,我们可以方便快捷地进行目标信息的提取。今天,小编将继续介绍几个函数。
(一)re.fullmatch
语法结构:fullmatch(pattern, string, flags=0)
其中,pattern是匹配要求(可以填正则表达式),string是用于匹配的字符串,flags是正则表达式的匹配方式。如果整个 string 匹配到正则表达式样式,就返回一个相应的匹配对象,否则就返回一个 None。
来看一个简单例子:
sentence = "This is an island."
print(re.fullmatch('is',sentence))
print(re.fullmatch('This is an island.',sentence))
返回的结果为:
None
<_sre.SRE_Match object; span=(0, 18), match='This is an island.'>
可见,fullmatch要求匹配全部字符,而不能只匹配部分。
当然,我们可以使用正则表达式来实现上一匹配目的,如查看string是否为非数字字符串:
print(re.fullmatch('\D+',sentence))
结果为:
<_sre.SRE_Match object; span=(0, 18), match='This is an island.'>
我们对比往期使用的search函数:
print(re.search('is',sentence))
结果为:
<_sre.SRE_Match object; span=(2, 4), match='is'>
可见,search函数是部分匹配,从左到右取第一个匹配到的内容。而fullmatch是全匹配。
(二)re.escape
语法结构:escape(pattern)
其中,pattern是待匹配的字符。escape函数可以对字符串中所有可能被解释为正则运算符的字符进行转义。
来看一个简单的例子:
s2='https://m.tb.cn/h.eIjvdhl?sm=8929f0'
print(re.escape(s2))
结果为:
https\:\/\/m\.tb\.cn\/h\.eIjvdhl\?sm\=8929f0
可以发现,在这一网址中,escape函数对“:”、“/”、“.”、“?”、”=”进行了转义。
接下来我们写一个数学运算符号的列表,使用escape函数转义一下:
operators = ['+','-','*','\']
for i in operators:
print(re.escape(i))
结果发现程序报错:
原因是”\”本来就代表转义符号,我们想引用它时,需要这样写:”\\”。
我们修改一下上述程序:
operators = ['+','-','*','\\']
for i in operators:
print(re.escape(i))
结果为:
\+
\-
\*
\\
此时我们就将具有正则表达式含义的字符成功转义了。
(三)re.finditer
语法结构:finditer(pattern, string, flags=0)
其中,pattern是匹配要求(可以填正则表达式),string是用于匹配的字符串,flags是正则表达式的匹配方式。finditer函数按照pattern对string进行匹配,从左到右,非重复依次匹配,返回一个迭代器iterator。
看到这里我们会发现它和findall函数有一点像,所以我进行了一下对比。
我们对s1匹配“is”,使用finditer函数依次寻找。
s3=re.finditer('is',s1)
print(s3)
print(type(s3))
得到的结果是:
<callable_iterator object at 0x000002B50372B0F0>
<class 'callable_iterator'>
可见,finditer函数返回的是一个迭代器,我们使用print函数不能看到其中的内容。对此,我们进行遍历,打印出来。
for s3i in s3:
print(s3i)
结果为:
<_sre.SRE_Match object; span=(2, 4), match='is'>
<_sre.SRE_Match object; span=(5, 7), match='is'>
<_sre.SRE_Match object; span=(11, 13), match='is'>
而之前我们介绍的findall函数则不同。
s4=re.findall('is',s1)
print(s4)
print(type(s4))
结果为:
['is', 'is', 'is']
<class 'list'>
可以发现,findall函数返回的是一个列表对象,可以以列表元素的形式直接显示匹配到的内容,在应用时可以根据需要进行选择。
以上就是我们对re库的进一步介绍了。至此,正则表达式的主要函数我们就介绍的差不多了,我们在使用时要注意观察待清洗文本的规律,结合正则表达式的元字符,让它为我们的工作助力。
给你一个贴心的reshape应用
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。