Python 创建正则表达式以查找标记文本中的重复标记序列

Python 创建正则表达式以查找标记文本中的重复标记序列,python,regex,repeat,Python,Regex,Repeat,我试着写一个正则表达式,在文本中找到复合名词短语,比如“武器生产设施”或“EPA空气质量监管公告”,并在文本中加上词性标记。我只想找到3个或更多单词长的复合名词短语。因此,我从标记的文本中刮去标记,然后在一行中查找三个或更多的名词标记。以下是我所拥有的: stringOfTags = 'DET NN NN NNS IN DET NN NN VBD JJ NNP NN NN NNS ' pattern = re.compile(r"(NN[SP]? ){3,}") match = pattern

我试着写一个正则表达式,在文本中找到复合名词短语,比如“武器生产设施”或“EPA空气质量监管公告”,并在文本中加上词性标记。我只想找到3个或更多单词长的复合名词短语。因此,我从标记的文本中刮去标记,然后在一行中查找三个或更多的名词标记。以下是我所拥有的:

stringOfTags = 'DET NN NN NNS IN DET NN NN VBD JJ NNP NN NN NNS '

pattern = re.compile(r"(NN[SP]? ){3,}")
match = pattern.findall(stringOfTags)
for item in match:
    print item
这是输出,这根本不是我想要的:

NNS
NN
相反,我希望它从stringOfTags中找到'NN NN NNS'和'NNP NN NN NNS'。有人能帮我创建一个正则表达式,在一行中找到3个或更多名词标记的字符串吗

import re

stringOfTags = 'DET NN NN NNS IN DET NN NN VBD JJ NNP NN NN NNS '

pattern = re.compile(r"((?:NN[SP]? ){3,})")
match = pattern.findall(stringOfTags)
for item in match:
    print(item)
产生

NN NN NNS 
NNP NN NN NNS 

您可以将捕获组
()
替换为非捕获组
(?:

pattern = re.compile(r"(?:NN[SP]? ){3,}")
或者使用非捕获组,将其与捕获组一起封装

pattern = re.compile(r"((?:NN[SP]? ){3,})")
最终解决方案:

import re

stringOfTags = 'DET NN NN NNS IN DET NN NN VBD JJ NNP NN NN NNS '

pattern = re.compile(r"(?:NN[SP]? ){3,}")
match   = pattern.findall(stringOfTags)

for item in match:
    print item
输出

NN NN NNS 
NNP NN NN NNS 

@简:我修改了正则表达式-使内部短语不返回,然后使多匹配短语返回。