我很感激帮助构建一个匹配以下内容的正则表达式,但不是最后一个示例。
我的目标是匹配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})?'
答案 0 :(得分:2)
我相信以下正则表达式适合你:
\bSOURCE\b:?(?!( +[A-Z]+){2}\b)((?: +\w+){2,})
基本上,如果该文本包含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)
示例:
答案 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