在regexr.com上,我开发了一个匹配某些类型的专有名称的正则表达式。这是表达式:
\b([a-z]?[A-Z]+[\w]*[ ]*)+\b
您可以看到它与许多示例匹配,如预期的那样 http://regexr.com/3bifh
E.g。来自一个字符串 Moby Dick或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?
答案 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*)+'
答案 1 :(得分:2)
当多个组匹配时,正则表达式引擎仅记住最后一个组。
您可以改用
print (re.findall(r"\b((?:[a-z]?[A-Z]+[\w]*[ ]*)+)\b", text))