阅读量:3
最近因为一些原因频繁使用正则表达式,因为以前系统整理过关于正则表达式的相关知识,所以这里仅记录使用期间遇到的问题。
本文内容基于re
包
1. match和search方法的区别
在Python中,re.search
和re.match
都是用于匹配字符串的正则表达式函数,但二者在匹配模式上有明显的区别。具体如下:
re.match
: 该函数只在字符串的开始位置进行匹配。如果开头不匹配,就不会继续匹配下去。其作用类似于从字符串的开位置起寻找能找到符合正则表达式模式的子串。re.search
: 该函数会在整个字符串中搜索,直到找到一个匹配的子字符串。其作用类似于从完整的字符串中找到与正则表达式完整匹配的子串。
代码举例如下:
import re rule=r'(ab|cd).*(ef|gh)' #以ab或cd开头,以ef或gh结尾的字符串 str1='abef' str2="dcabefabef" str3="abxyefabstefsc" print(re.match(rule,str1)) print(re.match(rule,str2)) print(re.match(rule,str3)) print(re.search(rule,str1)) print(re.search(rule,str2)) print(re.search(rule,str3))
其代码执行结果如下:
<re.Match object; span=(0, 4), match='abef'> None <re.Match object; span=(0, 12), match='abxyefabstef'> <re.Match object; span=(0, 4), match='abef'> <re.Match object; span=(2, 10), match='abefabef'> <re.Match object; span=(0, 12), match='abxyefabstef'>
从执行结果中可以发现,这两个方法的返回类型是一样的。
另外,使用^
和$
可以验证完整的字符串是否符合正则表达式规定的模式。具体举例如下:
rule=r'^(ab|cd).*(ef|gh)$' #以ab或cd开头,以ef或gh结尾的字符串 str1='abef' str2="dcabefabef" print(re.match(rule,str1)) print(re.match(rule,str2)) print(re.search(rule,str1)) print(re.search(rule,str2))
其执行结果如下:
<re.Match object; span=(0, 4), match='abef'> None <re.Match object; span=(0, 4), match='abef'> None
2. 利用正则表达式实现某些字符必须出现某些字符不能出现的效果
组合使用零宽断言可以实现利用利用正则表达式实现某些字符必须出现某些字符不能出现的效果。具体举例如下:
rule=r'^(?=.*(ab|cd))(?!.*xy).*$' #ab或cd必须出现,且不能包含xy str1="132ab23re" str2="sefeabsefewxyseid" str3="xyseqeqab" print(re.match(rule,str1)) print(re.match(rule,str2)) print(re.match(rule,str3))
其结果如下:
<re.Match object; span=(0, 9), match='132ab23re'> None None
但是在使用这种方式的时候要注意一点(ab|cd)
的后面不要添加.*
, 这个需要放到xy
的前面,否则实现不了同样的效果,展示如下:
import re rule=r'^(?=.*(ab|cd).*)(?!xy)$' str1="132ab23re" str2="sefeabsefewxyseid" str3="xyseqeqab" print(re.match(rule,str1)) print(re.match(rule,str2)) print(re.match(rule,str3))
其执行结果如下:
None None None
从结果中我们可以看到,str1和str2是符合要求但结果并没有匹配上。
另外,在这种情况下^
和$
的使用也需要注意,如果不添加这两种断言,结果可能也是错误的。展示如下:
import re rule=r'(?=.*(ab|cd))(?!.*xy)' str1="132ab23re" str2="sefeabsefewxyseid" str3="xyseqeqab" print(re.match(rule,str1)) print(re.match(rule,str2)) print(re.match(rule,str3))
其结果如下:
<re.Match object; span=(0, 0), match=''> None None