积极的外观与非捕捉群体:不同的行为

时间:2013-02-04 17:46:33

标签: python regex lookbehind capturing-group

我在我的代码中使用了python正则表达式(re module)并注意到了在这些情况下的不同行为:

re.findall(r'\s*(?:[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # non-capturing group
# results in ['a) xyz', ' b) abc']

re.findall(r'\s*(?<=[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # lookbehind
# results in ['a', ' xyz', ' b', ' abc']

我需要得到的只是['xyz', 'abc']。为什么示例的行为不同以及如何获得所需的结果?

2 个答案:

答案 0 :(得分:5)

第二种情况中包含ab的原因是因为(?<=[a-z]\))首先找到a),因为外观并非如此在字符串的开头消费你返回的任何字符。现在[^.)]+匹配a

现在您位于)。由于您已(?<=[a-z]\))个可选[^.)]+匹配xyz

b) abc

重复同样的事情

从第二种情况中移除?,您将获得预期结果,即['xyz', 'abc']

答案 1 :(得分:0)

您正在寻找的正则表达式是:

re.findall(r'(?<=[a-z]\) )[^) .]+', 'a) xyz. b) abc.')

我相信Anirudha目前接受的答案解释了你使用正面观察和非正面观察之间的差异,但是,在正面观察后删除?的建议实际上会导致{{1} (注意包含的空格)。

这是由于正面的后视不匹配[' xyz', ' abc']字符以及主匹配字符类本身中不包括space