繁体   English   中英

如果连续N个单词为大写,则不匹配的正则表达式

[英]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)

例:

http://regex101.com/r/uR5uW3/5

如果找到多个连续的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM