在Python中使用正则表达式从字符串中提取具有特定字符的单词列表
我有一个字符串包含单词,每个单词都有自己的标记(例如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']
什么是执行此任务的最佳途径,谢谢。
匹配组简单的字符串,然后将它们分割:
>>> [m.split() for m in re.findall(r"\w+/NNP(?:\s+\w+/NNP)*", sentence)]
[['Rapunzel/NNP', 'Sheila/NNP'], ['Yasir/NNP']]
谢谢,它解决了它。 – ytomo
使用不同的捕获组可以非常接近您的预期结果。
>>> re.findall(r'((?:\w+/NNP\s*)+)', sentence)
['Rapunzel/NNP Sheila/NNP ', 'Yasir/NNP']
捕获组((?:\w+/NNP\s*)+)
意志集团所有\w+/NNP
模式在两者之间可选的空间一起。
非常感谢您的参考。 – ytomo
这里是没有任何正则表达式的替代品。它采用groupby
和split()
:
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']]
你确定你需要'[ '长发公主/ NNP', '希拉/ NNP'],[ '亚西尔/ NNP']',而不是'[ '长发公主',“希拉'],['Yasir']'?你在'\ w +'周围的模式中设置了一个捕获组 - 它是一个“错字”吗? –
@WiktorStribiżewya,我实际上需要保留令牌(NNP)以进一步处理。 '\ w +'不是拼写错误,我想它的意思是在'/ NNP'之前检测任何字母。纠正我,如果我错了。谢谢 – ytomo
我的意思是括号。然后用Tim的建议。 –