使用Python中的regex从字符串中提取具有特定字符的单词列表

时间:2017-04-12 11:40:18

标签: python regex string

我有一个包含单词的字符串,每个单词都有自己的标记(例如NN / NNP / JJ等)。我想采取包含NNP 令牌的特定重复单词。到目前为止我的代码:

std_logic

代码的结果:

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)

正如我们所见,有3个单词包含NNP,即Rapunzel / NNP Sheila / NNP(彼此相邻)和Yasir / NNP(用其他NNP单词分隔单词)。我的问题是我需要用重复的NNP和另一个来说明这个词。我的预期结果如下:

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

执行此任务的最佳方式是,谢谢。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

捕获论坛((?:\w+/NNP\s*)+)会将所有\w+/NNP个模式与其间的可选空格分组。

答案 2 :(得分: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']]