天天看点

python正则表达式的零宽断言

零宽断言

零宽断言一共分为正向和反向两类,每类又分为预测先行和回顾后发两种:

  ####零宽度正预测先行断言

  简称正向先行断言,语法是(?=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
           

参考文章

继续阅读