Python正则表达式中的 零宽断言  …

首先说明一下什么是零宽断言,所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置。 正则表达式中有很多这样的断言,常见的如匹配字符串或者行的起始位置 ^ 和 /A,匹配字符串或者行的末尾 $ 和 /Z,单词边界/B等等。
这些简单的就不说了, 正则表达式 中只有当断言为真时才会继续进行匹配。
  
       (?:...)   非捕获组      只是无捕获组匹配exp,但不捕获匹配的文本,也不给这个组分配组号。

      (?=exp) 肯定式向前查找                  它断言自身出现的位置的后面能匹配表达式exp

      (?!exp否定式向前查找                  它断言自身出现的位置的后面不匹配表达式exp


      (?<=exp肯定式向后查找                它断言自身出现的位置的前面能匹配表达式exp

      (?exp否定式向后查找                它断言自身出现的位置的前面不匹配表达式exp



import re

pattern =  re.compile('^(?!00).*find$')

string1 =  '00 00 find'

string2 =  '11 00 find'

s1 = pattern.search(string1)

if s1:

    print s1.group()

s2 = pattern.search(string2)

if s2:

 

    print s2.group()

返回

>>> 

 

11 00 find


^(?!00) 就是说^这个表示开头,开头后面不跟有00。


注意

  •  group() 同group(0)就是匹配正则表达式整体结果
  •  group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

这里如果用  print s2.group(1)  就会出错,所以说  (?! exp ) 这个括号并不表示捕获。也不分配组号。


import re
pattern =   re.compile('^((?!00).)*$')         ##只要字符串中出现00   就不匹配

string1 =   '00 00   find'
string2 =   '11 00   find'


s1 = pattern.search(string1)
if s1:
    print '1:' + s1.group()

s2 = pattern.search(string2)
if s2:
    print '2:' + s2.group()

这样就一个也不匹配。
表达式(?!00).会往前查找,看看前面是不是没有“ 00 ”字串,如果没有(是其它字符),那么.(点号)就会匹配这些其它字符。但这样只会匹配一次。

((?!00).)* 这样就能匹配0次或多次了。
注意 
^((?!00).)*$   以^  开头, $结尾,表示在整个字符串中搜寻。


import re
pattern =   re.compile('^((?!00).)*find$')

string1 =   '00 00   find'
string2 =   '11 00   find'
string3 =   '11 11   find'
string4 =   '11 11   find?'


s1 = pattern.search(string1)
if s1:
    print '1:' + s1.group()

s2 = pattern.search(string2)
if s2:
    print '2:' + s2.group()

s3 = pattern.search(string3)
if s3:
    print '3:' + s3.group()

s4 = pattern.search(string4)
if s4:
    print '4:' + s4.group()

>>> 
3:11 11   find

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值