零宽断言
零宽断言一共分为正向和反向两类,每类又分为预测先行和回顾后发两种:
####零宽度正预测先行断言
简称正向先行断言,语法是(?=exp),它断言此位置的后面能匹配表达式exp。
####零宽度正回顾后发断言
简称正向后发断言,语法是(?<=exp),它断言此位置的前面能匹配表达式exp。
####零宽度负预测先行断言
简称反向先行断言,语法是(?!exp),它断言此位置的后面不能匹配表达式exp。
####零宽度负回顾后发断言
简称反向后发断言,语法是(?
(?=exp) 匹配exp后面的位置
(?<=exp) 匹配exp前面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
零宽断言定长宽度
当使用零宽断言出现以下错误信息:“sre_constants.error: look-behind requires fixed-width pattern”,我们可以得出python的re模块并不支持变长的后发断言,只支持定长的后发断言。
分组
可以使用分组匹配,完成零宽断言的功能,先将断言前后位置的字符全部匹配到,再取其中特定的元素即可。
import re
pattern = re.compile(r'<([a-zA-Z]+)>(.*)</\1>')#两个圆括号中的内容表示分组([a-zA-Z]+)、(.*)
s = '<html>hello world</html>'
ret = re.search(pattern, s)
print('re.groups():', ret.groups())#以元组的形式返回所有匹配的分组元素
print('re.group():', ret.group())#不考虑分组,返回整个匹配到的字符
print('re.group(0):', ret.group())#不考虑分组,返回整个匹配到的字符
print('re.group(1):', ret.group())#返回分组中第1个元素,计数从1开始
print('re.group(2):', ret.group())#返回分组中第2个元素,计数从2开始
结果如下 :
re.groups(): ('html', 'hello world')
re.group(): <html>hello world</html>
re.group(0): <html>hello world</html>
re.group(1): html
re.group(2): hello world
参考文章