Python 正则表达式后视不一致?

Python regex lookbehind inconsistency?

当我运行以下代码时:

重新导入

s = 'baaaad'

l = re.findall(r'((a)(?=a))', s)
print l
for elem in l:
    print ''.join(elem)

我得到输出:

[('a', 'a'), ('a', 'a'), ('a', 'a')] 一个 一个 一个

符合预期。但是当我尝试相应的后视策略时,即:

s = 'baaaad'

l = re.findall(r'((?<=b)(a))', s)
    print l
for elem in l:
    print ''.join(elem)

我得到:

[('a', 'a')] 一个

我期待得到:

[('b', 'a')] 巴

为什么这是(对我来说)意想不到的行为?如果我做错了什么,那是什么?以及如何修复它?

谢谢!

您似乎认为输出中的一组来自 (a),而另一组来自前瞻或后视。事实并非如此。其中一组是 (a),另一组来自整个正则表达式的括号:

 v    v not these
((?<=b)(a))
^         ^ these

先行 匹配 a,后行 匹配 b。它们匹配 position 之后出现 a 或之前出现 b 的字符串。它们不匹配任何实际字符。因此,您的两个正则表达式都只匹配 a,对之前或之后可能出现的内容有限制,并且两个正则表达式中的两个捕获组都只捕获 a.