使用一个或多个单词获取连续大写单词的正则表达式不起作用

时间:2015-07-22 18:02:36

标签: python regex

我试图用一个或多个连续大写单词,但看起来它对我不起作用。

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

2 个答案:

答案 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(和大多数口味)都不支持它。

工作示例:https://regex101.com/r/sT1rS4/1