Python正则表达式lookbehind不一致?
问题描述:
当我运行下面的代码:Python正则表达式lookbehind不一致?
进口重新
s = 'baaaad'
l = re.findall(r'((a)(?=a))', s)
print l
for elem in l:
print ''.join(elem)
我得到的输出:
[( 'A', 'A'),( 'A', 'A' ),('a','a')] aa aa aa
这是预期的。但是,当我尝试了回顾后,即相应的策略:
s = 'baaaad'
l = re.findall(r'((?<=b)(a))', s)
print l
for elem in l:
print ''.join(elem)
我得到:
[( 'A', 'A')] AA
我期待得到:
[('b','a')] ba
为什么对我(这个)意外的行为?如果我做错了什么,它是什么?以及如何解决它?
谢谢!
答
您似乎认为输出中的其中一组来自(a)
,另一组来自前瞻或后视。事实并非如此。其中一组是(a)
,另一个是从周围的整个正则表达式的括号:
v v not these
((?<=b)(a))
^ ^these
先行不比赛a
,并且回顾后不比赛b
。它们匹配位置,之后出现a
或之前出现b
。他们不匹配任何实际的字符。因此,这两个正则表达式只匹配a
,并限制前后的内容,并且两个正则表达式中的捕获组仅捕获a
。
只需要提一下,在查找'((? revo
'中捕获字符是没有问题的。所以你在说,即使是对于预见的“正确”答案是因为其他原因? – whirlaway
@whirlaway:是的。你有两个可见效果恰好相反的bug,所以它恰好产生你想要的输出。当你稍微改变了一些东西时,错误的影响就停止了。 – user2357112