当我运行以下代码时:
导入重新
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
为什么这(对我而言)出乎意料的行为?如果我做错了什么,那是什么?以及如何解决它?
谢谢!
答案 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));
。