Python正则表达式看起来不一致?

时间:2017-03-07 18:55:26

标签: python regex lookahead lookbehind

当我运行以下代码时:

导入重新

s = 'baaaad'

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

我得到了输出:

[(' a',' a'),(' a'' a'),' a& #39;,' a')] AA AA AA

这是预期的。但是当我尝试相应的lookbehind策略时,即:

s = 'baaaad'

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

我明白了:

[(&#39; a&#39;,&#39; a&#39;)] AA

我期待得到:

[(&#39; b&#39;,&#39; a&#39;)] BA

为什么这(对我而言)出乎意料的行为?如果我做错了什么,那是什么?以及如何解决它?

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

前瞻匹配a,后瞻 匹配b。它们匹配字符串中的位置,之后发生a,或者b之前发生a。它们与任何实际角色都不匹配。因此,您的正则表达式只匹配a,对前后可能出现的内容有限制,并且两个正则表达式中的两个捕获组仅捕获DecimalFormat df = new DecimalFormat("##.##"); df.setRoundingMode(RoundingMode.DOWN); System.out.println("The circumference is:"+df.format(circum));