5

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

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']. 为什么这些示例的行为不同以及如何获得所需的结果?

4

2 回答 2

5

包含在第二种情况下的原因是因为 会首先找到a并且由于环视不消耗任何字符,因此您回到了字符串的开头。现在匹配b(?<=[a-z]\))a)[^.)]+a

现在你在)。因为你已经进行了(?<=[a-z]\))可选的[^.)]+匹配xyz

重复同样的事情b) abc

从第二种情况中删除?,你会得到预期的结果,即['xyz', 'abc']

于 2013-02-04T17:53:04.860 回答
0

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

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

我相信 Anirudha 目前接受的答案解释了您使用正向后视和非捕获井之间的区别,但是,在?正向后视后删除的建议实际上会导致[' xyz', ' abc'](注意包含的空格)。

这是由于不匹配space字符以及不包括space在主要匹配字符类本身中的积极后视。

于 2017-08-10T13:49:09.553 回答