在 regexr.com 上,我开发了一个匹配特定类型专有名称的正则表达式。这是表达式:
\b([a-z]?[A-Z]+[\w]*[ ]*)+\b
例如从字符串 Moby Dick or the White Whale by Herman Melville 匹配 Moby Dick、White Whale 和 Herman 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))
参见 here ,它匹配第一部分但捕获第二部分。 re.findall 将首先优先考虑捕获,然后才是匹配。所以它打印出第二部分。
如果您不想匹配尾随空格字符,请像吹气一样改变您的模式。
r'\b[a-z]?[A-Z]+\w*(?: [a-z]?[A-Z]+\w*)+'
