零宽断言就是一种零宽度的匹配,它匹配的内容不会保存到匹配结果中。表达式的匹配内容只是代表了一个位置而已。比如说,标明某个字符的右边界是怎样的构造。
字符 | 描述 |
---|---|
?= | 零宽度正预测先行断言,它断言自身出现位置的后面可以匹配后面跟的表达式 |
?<= | 零宽度正回顾后发断言,它断言自身出现位置的前面可以匹配后面跟的表达式 |
?! | 零宽度负预测先行断言,它断言自身出现位置的后面不可以匹配后面跟的表达式 |
?<! | 零宽度负回顾后发断言,它断言自身出现位置的前面不可以匹配后面跟的表达式 |
乍一看上面这个表格,脑子都大了。这零宽断言到底是啥?我怎么这么蒙啊?
必须承认的是,零宽断言的确是有点难理解,所以还是得结合代码来进行思考。
import re
s = r'eating apple seeing paper watching movie'
m1 = re.findall(r'(\b\w+?)ing', s)
print(m1)
m2 = re.findall(r'(.+?)(?=ing)', s)
print(m2)
m3 = re.findall(r'(.+?)(?<=ing)', s)
print(m3)
s = 'unite one unethical ethics use unite ultimate'
m4 = re.findall(r'\b(?!un)\w+\b', s)
print(m4)
m5 = re.findall(r'(?<! [a-z])\d{3,}', 'abc123, 123, 4567')
print(m5)
执行结果
['eat', 'see', 'watch']
['eat', 'ing apple see', 'ing paper watch']
['eating', ' apple seeing', ' paper watching']
['one', 'ethics', 'use', 'ultimate']
['123', '123', '4567']
从代码和执行结果来看,再结合思考,就可以更好的理解零宽断言到底是啥东西了。嗯就是那种很微妙的感觉。