Regex 匹配n个连续大写单词的正则表达式

Regex 匹配n个连续大写单词的正则表达式,regex,python-3.6,Regex,Python 3.6,我试图捕捉n个连续的大写单词。我现在的代码是 n=5 a='This is a Five Gram With Five Caps and it also contains a Two Gram' re.findall(' ([A-Z]+[a-z|A-Z]* ){n}',a) 返回以下内容: ['Caps '] 它标识第五个连续的大写单词,但我希望它返回整个大写单词字符串。换言之: [' Five Gram With Five Caps '] 将整个图案包装在捕获组中: (([A-Z]+[

我试图捕捉n个连续的大写单词。我现在的代码是

n=5 
a='This is a Five Gram With Five Caps and it also contains a Two Gram'
re.findall(' ([A-Z]+[a-z|A-Z]* ){n}',a)
返回以下内容:

['Caps ']
它标识第五个连续的大写单词,但我希望它返回整个大写单词字符串。换言之:

[' Five Gram With Five Caps ']

将整个图案包装在捕获组中:

(([A-Z]+[a-z|A-Z]* ){5})

请注意,
|
在字符类中不充当
。它将与
|
完全匹配。这里的另一个问题是
findall
的行为是返回匹配,除非存在一个组(尽管没有明确说明):

从左到右扫描字符串,并按找到的顺序返回匹配项如果模式中存在一个或多个组,则返回组列表

这就是为什么要得到第一个捕获组的结果,它是
Caps
的最后一个大写起始词

简单的解决方案是将捕获组更改为非捕获组。我还将开始时的空格改为
\b
,这样就不会匹配额外的空格(我猜您正计划修剪)

  • \b
    将位置断言为单词边界
  • (?:[A-Z][A-zA-Z]*?){5}
    精确匹配以下5次
    • [A-Z]
      将大写ASCII字母匹配一次
    • [a-zA-Z]*
      匹配任意ASCII字母任意次数
    • 匹配空格
结果:
[“五克五顶”]

此外,您还可以使用正则表达式。这将允许在字符串的开始/结束以及中间的任何地方进行匹配,而不需要捕获额外的空白。另一种选择可能包括

import re

r = re.compile(r"\b(?:[A-Z][a-zA-Z]* ){5}")
s = "This is a Five Gram With Five Caps and it also contains a Two Gram"
print(r.findall(s))
\b(?:[A-Z][a-zA-Z]* ){5}