[toc]
一、零宽断言-介绍
零宽断言,它匹配的内容不会提取,其作用是在一个限定位置的字符串向前或向后进行匹配查找。
1.1、应用场景
排除查找,查找不含有某段字符串的行
包含查找,查找含有某段字符串的行
二、断言的分类
2.1、正先行断言
什么是正先行断言,就是在字符串相应位置之前进行查找匹配,使用 (?=exp) 匹配exp前面的位置。
import re
str = 'abcgwcab'
pattern = 'bc(?=gw)'
result = re.search(pattern,str)
print(result.group())
# 输出结果
bc
解析:首先查找字符串”abcgwcab”中gw位置,断言为真,然后再匹配 bc,然后再向后匹配。
example:
pattern = 'bc(?=gw)ca'
# 匹配失败,因为找到了 gw 的位置后,断言为真,再向前匹配 bc ,再然后是从 bc 处进行匹配是 gwca ,所以会失败。
pattern = 'bc(?=gw)gwca'
# 匹配成功,输出结果
bcgwca
2.2、反先行断言
什么是反先行断言,使用 (?!exp) 匹配后面跟的不是exp。
import re
str = 'abcgwcab'
pattern = 'bc(?!ww)gw'
result = re.search(pattern,str)
print(result.group())
# 输出结果
bcgw
解析:首先判断字符串是否包含bc,然后判断其后面不是ww,断言为真,然后从 bc 处进行匹配 gw。
2.3、正后发断言
什么是正后发断言,就是在字符串相应位置之后进行查找匹配, (?<=exp) 匹配exp后面的位置
import re
str = 'abcgwcab'
pattern = '(?<=gw)ca'
result = re.search(pattern,str)
print(result.group())
# 输出结果
ca<