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

时间:2014-07-13 17:45:28

标签: python regex

我很感激帮助构建一个匹配以下内容的正则表达式,但不是最后一个示例。

我的目标是匹配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

我的尝试,但我意识到这只是匹配'来源'在示例中顶部。

pat = 'SOURCE:?\s+(?![A-Z\s]{2,20})?'

4 个答案:

答案 0 :(得分:2)

我相信以下正则表达式适合你:

\bSOURCE\b:?(?!( +[A-Z]+){2}\b)((?: +\w+){2,})

Online Regex Demo

基本上,如果该文本包含2个连续的全部大写单词,则此正则表达式只会丢弃文本文本SOURCE之后的任何文本。

答案 1 :(得分:0)

鉴于你提供了什么,一个模式表明在某个地方SOURCE之后至少有一个小写字母可以解决问题。

答案 2 :(得分:0)

此模式应与您显示的前三个匹配:

(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

答案 3 :(得分:0)

根据您帖子的主题,如果找到超过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