python 正则表达式之零宽断言

零宽断言:用于查找特定内容以前或以后的内容,但并不包括特定内容自己
对于零宽断言来讲,我认为最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该知足必定的条件(它附近知足什么表达式),而且这个位置不是字符(所以匹配返回无结果),仅仅是一个位置,所以它们也被称为零宽断言
零宽断言重点的这一个位置,是经过一个条件:这个位置附近(前或者后)存在或者不存在一个A(A能够是一个表达式)来决定的正则表达式

 

请忘记它的各类名字,咱们只记忆公式自己:spa

(?=exp) :此位置后面匹配表达式exp
(?<=exp):此位置前面匹配表达式exp
(?!exp):此位置后面不匹配表达式exp
(?<!exp):此位置前面不匹配表达式exp
:有些地方只支持部分零宽断言,好比在线正则表达式import

下面是示例:
>>> import re
>>> str = '<div>hello world</div>'
>>> re.search('(?=he).*',str)
<_sre.SRE_Match object; span=(5, 22), match='hello world</div>'>
>>> re.search('(?=he).*(?<=ld)',str)
<_sre.SRE_Match object; span=(5, 16), match='hello world'>
>>> re.search('(?<=<div>).*(?=</div>)',str)
<_sre.SRE_Match object; span=(5, 16), match='hello world'>object

>>> str = '3446456sdff456a'
>>> re.search('[a-z]{3}(?!/d)',str)
<_sre.SRE_Match object; span=(7, 10), match='sdf'>
>>> re.search('[a-z]{3}(?![a-z])',str)
<_sre.SRE_Match object; span=(8, 11), match='dff'>im

>>> re.search('(?<![0-9])[0-9]{3}',str)
<_sre.SRE_Match object; span=(0, 3), match='344'>   #匹配到了第一个位置
>>> re.search('(?<![0-9])[0-9]{3}(?![0-9])',str)
<_sre.SRE_Match object; span=(11, 14), match='456'>di

相关文章
相关标签/搜索