1 (?:…)
表示一个匹配不用保存的分组
>>> a = '123dd'
>>> re.match('(?:\d+)', a).groups()
()
>>> re.match('(\d+)', a).groups()
('123',)
>>>
2 (?P…)
使用标签表示匹配的内容,注意这里用的是groupdict()
>>> re.match('(?P<data>\d+)', a).groupdict()
{'data': '123'}
>>>
3(?P=name)
引用之前已经匹配的tag
>>> a = '123dd123'
>>> re.match('(?P<data>\d+)dd(?P=data)$', a).groupdict()
{'data': '123'}
>>>
以上例子中,第一个data为123, 后面的data引用了上一个匹配的data,所以也得匹配
4 (?#…)
表示注释,所有内容都被忽略
>>> re.match('(?P<data>\d+).*?(?#this is coment)', a).groupdict()
{'data': '123'}
>>>
5 (?=…)
正向前视断言。仅当子表达式 … 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配
>>> re.match('\w+(?=\d)', 'aa123').group()
'aa12'
可以看出,匹配的是单个数字之前的内容
6 (?!..)
负向前视断言。仅当子表达式 … 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配
>>> re.match('\w+(?!\d)', 'aa12.3').group()
'aa12'
>>>
7 (?<=…)
正向后视断言。仅当子表达式 …在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配
>>> re.search('(?<=95|98|NT)Windows', '95Windows')
<_sre.SRE_Match object; span=(2, 9), match='Windows'>
8 (?<!..)
负向后视断言。仅当子表达式 …不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配
>>> re.search('(?<!95|98|NT)Windows', 'aaWindows')
<_sre.SRE_Match object; span=(2, 9), match='Windows'>
9 (?(id/name)Y|N)
如果分组所提供的id或者name存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N;|N是可选项
如:(?(1)y|x)