零宽断言就是一种零宽度的匹配,它匹配的内容不会保存到匹配结果中。表达式的匹配内容只是代表了一个位置而已。比如说,标明某个字符的右边界是怎样的构造。

字符描述
?=零宽度正预测先行断言,它断言自身出现位置的后面可以匹配后面跟的表达式
?<=零宽度正回顾后发断言,它断言自身出现位置的前面可以匹配后面跟的表达式
?!零宽度负预测先行断言,它断言自身出现位置的后面不可以匹配后面跟的表达式
?<!零宽度负回顾后发断言,它断言自身出现位置的前面不可以匹配后面跟的表达式
零宽断言的断言字符

乍一看上面这个表格,脑子都大了。这零宽断言到底是啥?我怎么这么蒙啊?

必须承认的是,零宽断言的确是有点难理解,所以还是得结合代码来进行思考。

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']

从代码和执行结果来看,再结合思考,就可以更好的理解零宽断言到底是啥东西了。嗯就是那种很微妙的感觉。

你也可能喜欢

发表评论