Python正则表达式不匹配所有预期的单词

时间:2015-08-11 18:39:24

标签: python regex findall

在regexr.com上,我开发了一个匹配某些类型的专有名称的正则表达式。这是表达式:

\b([a-z]?[A-Z]+[\w]*[ ]*)+\b

您可以看到它与许多示例匹配,如预期的那样 http://regexr.com/3bifh

E.g。来自一个字符串 Moby Dick或Herman Melville的白鲸它匹配Moby DickWhite WhaleHerman Melville

我试图在Python中重现这一点,但收效甚微。这是代码:

import re

text = "Moby Dick or the White Whale by Herman Melville"
print(re.findall(r"\b([a-z]?[A-Z]+[\w]*[ ]*)+\b", text))

输出结果为:

['Dick ', 'Whale ', 'Melville']

这只匹配上面每个结果的最后一部分。 为什么表达式不能用于Python?

2 个答案:

答案 0 :(得分:3)

将捕获组转为非捕获组。

print(re.findall(r"\b(?:[a-z]?[A-Z]+[\w]*[ ]*)+\b", text))

参见here,它与第一部分匹配,但捕获第二部分。 re.findall会首先选择捕获,然后是匹配。所以它打印出第二部分。

如果你没有想要匹配尾随空格字符,那就改变你的模式就像打击一样。

r'\b[a-z]?[A-Z]+\w*(?: [a-z]?[A-Z]+\w*)+'

DEMO

答案 1 :(得分:2)

当多个组匹配时,正则表达式引擎仅记住最后一个组。

您可以改用

 print (re.findall(r"\b((?:[a-z]?[A-Z]+[\w]*[ ]*)+)\b", text))