目的:把数字后面不为abc的字符串找出来
如1ab符合要求,2abc不符合要求
1 str = '1ab' 2 out = re.match(r'\d+(?!abc)',str) 3 4 str1 = '1abc' 5 out1 = re.match(r'\d+(?!abc)',str1) 6 7 print('out:',out) 8 print('out1:',out1) 9 # 10 #out: <_sre.SRE_Match object; span=(0, 1), match='1'> 11 #out1: None 12 #
如果把(?!abc)改为[^abc],效果如下:
1 str = '1ab' 2 out3 = re.match(r'\d+[^abc]',str) 3 4 str1 = '1abc' 5 out4 = re.match(r'\d+[^abc]',str1) 6 7 print('out:',out3) 8 print('out1:',out4) 9 10 # 11 #out3: None 12 #out4: None
总结:
(?!abc)是把abc当做一个整体进行匹配,字符串中不存在abc才能成功,abc作为一个整体进行匹配
[^abc]只要字符串中存在a/b/c中的任一个即匹配不成功,字符串中不能出现a/b/c中的任一个
------------------------------------------------------------------
更新:
之前没有注意到(?!abc)方式匹配字符串不消耗字符串内容这句话,导致如果字符串中间排除一个子字符串时会出现错误。
更新关于这部分的理解
(?=...) # 匹配字符串,且紧挨着匹配的字符串之后的字符等于...,才算匹配成功,且不消耗字符串内容
(?!...)
# 匹配字符串,且紧挨着匹配的字符串之后的字符不等于...,才算匹配成功
,且不消耗字符串内容
(?<=...)
# 匹配字符串,且紧挨着匹配的字符串之前的字符等于...,才算匹配成功
,且不消耗字符串内容
(?<!...)
# 匹配字符串,且紧挨着匹配的字符串之前的字符不等于...,才算匹配成功
,且不消耗字符串内容
具体理解:
以(?=...)
为例
1 reg = re.compile('A(?=BC)') 2 reg.search('ABC') 3 reg.search('ABCDE') 4 5 6 # 输出: 7 # <_sre.SRE_Match object; span=(0, 1), match='A'> 8 # <_sre.SRE_Match object; span=(0, 1), match='A'>
1 reg_1 = re.compile('A(?=BC)D') 2 print(reg_1.search('ABCD')) 3 4 5 # 输出 6 # None
reg = re.compile('A(?=BC)')reg.search('ABC')
vt.搜索;搜寻;调查;搜查;探求
n.搜寻;探究,查究
n.(Search)人名;(英)瑟奇