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

Python regular expression is not matching all expected words

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

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

您可以在 http://regexr.com/3bifh

例如来自 Herman Melville 的字符串 Moby Dick or the White Whale 它匹配 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 中不起作用?

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

您可以改用这个

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

将捕获组转为非捕获组。

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

参见 here,它匹配第一部分但捕获了第二部分。 re.findall 会优先考虑捕获,然后才是匹配。所以它打印出第二部分。

如果您不想匹配尾随的 space 字符,请改变您的模式。

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

DEMO