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

+0

只需要提一下,在查找'((? revo

+0

'中捕获字符是没有问题的。所以你在说,即使是对于预见的“正确”答案是因为其他原因? – whirlaway

+0

@whirlaway:是的。你有两个可见效果恰好相反的bug,所以它恰好产生你想要的输出。当你稍微改变了一些东西时,错误的影响就停止了。 – user2357112