首先说明一下什么是零宽断言,所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置。
正则表达式中有很多这样的断言,常见的如匹配字符串或者行的起始位置 ^ 和 /A,匹配字符串或者行的末尾 $ 和 /Z,单词边界/B等等。
(?:...) 非捕获组
只是无捕获组匹配exp,但不捕获匹配的文本,也不给这个组分配组号。
print '1:' + s1.group()
print '2:' + s2.group()
print '1:' + s1.group()
print '2:' + s2.group()
print '3:' + s3.group()
print '4:' + s4.group()
import re
pattern =
string1 =
string2 =
s1 = pattern.search(string1)
if s1:
s2 = pattern.search(string2)
if s2:
返回
>>>
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:
s2 = pattern.search(string2)
if s2:
这样就一个也不匹配。
表达式(?!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:
s2 = pattern.search(string2)
if s2:
s3 = pattern.search(string3)
if s3:
s4 = pattern.search(string4)
if s4:
>>>
3:11 11
find