还是开篇点题,本篇文章所依赖的环境为:
使用
find
方法查找系统库re
的命令为:
这篇文章将持续介绍python
正则表达式,上一节我们介绍了正则表达式的一些概念和基础正则表达式的使用,如果没有看过的小伙伴,强烈先看上一篇文章: juejin.cn/post/722125…。
本篇文章,将继续讲解python
正则表达式,主要是python
的re
模块熟练使用,如果还对正则表达式特殊字符有问题或者不太熟悉的,建议先看python
官方文档这块的描述: docs.python.org/zh-cn/3.7/l… 。
python re常用方法
python
提供的标准模块re
是与perl
类似的正则表达式操作的模块,在python 1.5
版本中被引入,主要是用于替换regex
和regsub
模块,当然了,这2个模块也在python 2.5
的时候被移除掉了。后面关于正则,只需要引入re
模块就好了(仅限于文章开头所标注的python
版本哦)。
我们之前只用过compile
和findall
,其实re
还有很多的方法,例如:
re
库中常用的方法:
compile
: 编译为正则表达式对象。findall
: 查找字符串中出现的正则表达式模块,并且返回一个列表。finditer
: 和findall
模块一样,只不过返回的是一个迭代器。match
: 从字符串开头匹配,成功返回匹配的第一个对象以及下标,失败则返回None
。search
: 匹配整个字符串,成功就返回匹配对象,失败就返回None
。
接下来,我们一起看看应用实例。
正则表达式编译还是不编译
是不是很好奇,python
作为解释性语言,为什么还会有编译正则表达式呢,而且还提供了对应的方法compile
。
在回答这个问题之前,我们先来看个例子:
import re # 测试字符串 testTxt = "hello pdudo juejin , 好好学习,天天向上" # 方法1 print(re.findall('p[du]{3}o',testTxt)) # 方法2 compile = re.compile("p[du]{3}o") print(re.findall(compile,testTxt))
上述代码中,首先定义了一个字符串testTxt
,而后直接在findall
中使用正则字符串 以及使用compile
编译后的正则表达式。
当然了,2个属于都输出了预期的结果:
所以,问题来了:为什么需要编译正则表达式?
这是因为使用compile
方法,可以将正则表达式编译成一个可复用的对象,以便这个对象在多次匹配调用的时候一次来提高性能 且 使代码更易读、易维护。
额,,,那么它是咋提高性能的呢? 我们看下底层代码了。
我们点进re
模块的compile
方法,发现就调用了_compile
方法。
我们可以持续查看_compile
来了解底层是如何操作的:
在此函数中,首先会尝试在缓存中获取已经编译过得正则表达式对象,该方法是_cahce
,如果找到了,就直接返回之,否则就会检查正则表达式语法是否合规,而后使用 sre_compile
的compile
进行编译为对象,最后存进缓存中。
所以通过上述案例来讲,如果正则表达式需要多次使用,那么建议还是使用compile
进行编译。
使用match和search匹配字符串
search
方法多用于匹配字符串内容,使用search
进行匹配正则,如果成功,则会返回匹配的第一个的信息,包括下标,以及匹配的字符串(可以使用group
获取),如果失败,则会返回None
,例如如下代码:
import re testTxt = "hello pdudo juejin , 好好学习,天天向上,pdudo" print(re.search('pdudo',testTxt)) print(re.search('123',testTxt))
可以运行看下:
由于匹配123
没有,所以直接返回None
,如果匹配成功了,则返回第一个匹配的下标(span
), 以及匹配成功的值(match
)。
可以将上述给优化一下,使用一个if
判断之:
而match
,用法和search
几乎一致,但是需要注意的是,它只能从字符串开头进行匹配,相当于加了一个正则特殊字符^
。
例如:
所以做个总结:
search
方法会搜索整个字符串,并且返回第一个匹配的。
match
方法会从字符串开头进行匹配,并且返回第一个匹配的。
使用 findall 和 finditer 匹配字符串
这2个方法都会返回所有的匹配项,只不过前则是以列表的方式返回的,而后则是以迭代器的方式返回的,具体可看下面这个例子:
此二者都可以使用for
进行循环,迭代器和列表的区别就暂不叙述了,可以翻翻之前的文章。
总结
该篇文章,总共介绍了python
中re
的5个方法,分别为: compile
、match
、search
、findall
以及finditer
。
其中match
和search
都是返回匹配到的第一个字符串,但是match
是从行首就开始匹配,而search
是匹配整个字符串。
而findall
和finditer
则是返回所有匹配到的字符串,前者是以列表的方法返回,后则是以迭代器的方式返回。