2017-04-12 169 views
2

我有一个字符串包含单词,每个单词都有自己的标记(例如NN/NNP/JJ等)。我想采取包含NNP令牌的重复单词。到目前为止我的代码:在Python中使用正则表达式从字符串中提取具有特定字符的单词列表

import re 

sentence = "Rapunzel/NNP Sheila/NNP let/VBD down/RP her/PP$ long/JJ golden/JJ hair/NN in Yasir/NNP" 

tes = re.findall(r'(\w+)/NNP', sentence) 
print(tes) 

代码的结果是:

['Rapunzel', 'Sheila', 'Yasir'] 

正如我们看到的,有3个字包含NNP那些长发公主/ NNP希拉/ NNP(旁边显示对方)和Yasir/NNP(与其他NNP词汇分开)。我的问题是我需要用重复的NNP和另一个来重复这个词。我预期的结果是这样的:

['Rapunzel/NNP', 'Sheila/NNP'], ['Yasir/NNP'] 

什么是执行此任务的最佳途径,谢谢。

+0

你确定你需要'[ '长发公主/ NNP', '希拉/ NNP'],[ '亚西尔/ NNP']',而不是'[ '长发公主',“希拉'],['Yasir']'?你在'\ w +'周围的模式中设置了一个捕获组 - 它是一个“错字”吗? –

+0

@WiktorStribiżewya,我实际上需要保留令牌(NNP)以进一步处理。 '\ w +'不是拼写错误,我想它的意思是在'/ NNP'之前检测任何字母。纠正我,如果我错了。谢谢 – ytomo

+0

我的意思是括号。然后用Tim的建议。 –

回答

3

匹配组简单的字符串,然后将它们分割:

>>> [m.split() for m in re.findall(r"\w+/NNP(?:\s+\w+/NNP)*", sentence)] 
[['Rapunzel/NNP', 'Sheila/NNP'], ['Yasir/NNP']] 
+0

谢谢,它解决了它。 – ytomo

2

使用不同的捕获组可以非常接近您的预期结果。

>>> re.findall(r'((?:\w+/NNP\s*)+)', sentence) 
['Rapunzel/NNP Sheila/NNP ', 'Yasir/NNP'] 

捕获组((?:\w+/NNP\s*)+)意志集团所有\w+/NNP模式在两者之间可选的空间一起。

+0

非常感谢您的参考。 – ytomo

1

这里是没有任何正则表达式的替代品。它采用groupbysplit()

from itertools import groupby 

string = "Rapunzel/NNP Sheila/NNP let/VBD down/RP her/PP$ long/JJ golden/JJ hair/NN in Yasir/NNP" 
words = string.split() 

def get_token(word): 
    return word.split('/')[-1] 

print([list(ws) for token, ws in groupby(words, get_token) if token == "NNP"]) 
# [['Rapunzel/NNP', 'Sheila/NNP'], ['Yasir/NNP']] 
相关问题