[英]Regex that does not match if consecutive N number of words are upper case
我非常感谢您提供一些帮助来构造与以下示例(而不是最后一个示例)匹配的正则表达式。
我的目标是匹配Source后面的单词,但是这些单词应该是组织名称。 这些组织名称中有99%并非全为大写。 我想避免匹配仅包含单词SOURCE的标签,而这些标签通常是n长度的大写单词。
组织名称并非全为大写。 他们可以采取任何形式,而不仅仅是“基金会”等。
比赛
SOURCE Skoll Foundation SUBJECT: --> 'Skoll Foundation'
SOURCE: Skoll Foundation; ABC Found; Institute of Humane INDUSTRY: --> ['Skoll Foundation', 'ABC Found', 'Institute of Humane']
SOURCE SKOLL Foundation --> ['SKOLL Foundation']
不符合以下条件:
OPEN SOURCE SOFTWARE (89%)
SOURCE SOFTWARE ENTERPRISE
我的尝试,但我意识到在上例中这仅与“ SOURCE”匹配。
pat = 'SOURCE:?\s+(?![A-Z\s]{2,20})?'
我相信以下正则表达式应该为您工作:
\bSOURCE\b:?(?!( +[A-Z]+){2}\b)((?: +\w+){2,})
基本上,如果该正则表达式包含两个连续的所有大写字母,则该正则表达式只会丢弃文字文本SOURCE
之后的任何文本。
根据您所提供的内容,一种模式表明在SOURCE
之后至少有一个小写字母可以解决问题。
此模式应与您显示的前三名相符:
(SOURCE.*[S][Kk][Oo].+\s*)
码:
import re
p = re.compile(ur'(SOURCE.*[S][Kk][Oo].+\s*)', re.MULTILINE)
re.findall(p, str)
例:
如果找到多个连续的n个大写单词,则按照您的帖子主题在下面显示“失败”。 我没有用过正则表达式,但是应该可以。
s = "SOURCE SKOLL foundation"
splitData = s.split(" ")
n = 1 # Max consecutive upper case words that are acceptable
i = 0
for eachWord in splitData:
i += eachWord.isupper()
if i > n:
print("Failed")
break
if not eachWord.isupper():
i = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.