我在我的代码中使用了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']
。为什么示例的行为不同以及如何获得所需的结果?
答案 0 :(得分:5)
第二种情况中包含a
和b
的原因是因为(?<=[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
。