python3 正则匹配[^abc]和(?!abc)的区别(把多个字符作为一个整体匹配排除)

目的:把数字后面不为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')

 

 

search
英 [sɜːtʃ] 美 [sɝtʃ]
vi.搜寻;调查;探求
vt.搜索;搜寻;调查;搜查;探求
n.搜寻;探究,查究
n.(Search)人名;(英)瑟奇

转载于:https://www.cnblogs.com/congyinew/p/7473835.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值