我试图用一个或多个连续大写单词,但看起来它对我不起作用。
def extract(string):
return re.findall('([A-Z][a-z]*(?=\s[A-Z])(?:\s+[A-Z][a-z]*)*)', string)
这是我的测试用例
def test_extract_capitalize_words(self):
keywords = extract('This is New York and this is London')
self.assertEquals(['New York', 'London'], keywords)
它仅捕获New York
而非London
答案 0 :(得分:0)
这将匹配连续捕获的单词或大写单词后跟行边界的结尾。
>>> import re
>>> s = 'This is New York and this is London'
>>> re.findall(r'\b[A-Z][a-z]*\b(?:(?:\s+[A-Z][a-z]*\b)+|$)', s)
['New York', 'London']
答案 1 :(得分:0)
这是一个简洁的选项:
\b(?:[A-Z][a-z]*\b\s*)+
regex
模块而不是re
,请考虑使用\p{Lu}
和\p{Ll}
代替[A-Z]
而不是[a-z]
和\b
的Unicode大写和小写字母{1}}。McBain
是字边界,用于避免匹配GOP
或\b
等字词。如果您想匹配这些'删除第二个[a-z]*
。A
用于允许使用单个字母的字词,例如I
或+
。如果您不想要,请使用(?<!\s)
。\>
显式删除该空间。像MutationObserver
(单词结束)这样的功能会更优雅,但Python(和大多数口味)都不支持它。