我对正则表达式还是很陌生,比如Python库re
。你知道吗
我想把所有的专有名词提取成一个完整的词,如果它们被空格隔开的话。你知道吗
我试过了
result = re.findall(r'(\w+)\w*/NNP (\w+)\w*/NNP', tagged_sent_str)
输入:我有一个字符串
tagged_sent_str = "European/NNP Community/NNP French/JJ European/NNP export/VB"
预期输出:
[('European Community'), ('European')]
电流输出:
[('European','Community')]
但这只会给一对而不是一对。我要各种各样的
有趣的要求。注释中解释了代码,这是一种仅使用
REGEX
的非常快速的解决方案:输出:
解释正则表达式:
(?:\s+|^)
:跳过前导空格((?:(?:\s)?\w+(?=\s+|$))+)
:捕获一组非连接子组(?:(?:\s)?\w+(?=\s+|$))
子组将匹配按空格或行尾折叠的所有序列字。而这场比赛将被全球小组捕获。如果我们不这样做,比赛将只返回第一个字。(?:\s+|$)
:删除序列的尾部空格我需要从目标单词中删除
/NNP
,因为您希望将word/NNP
的序列保留在一个组中,执行类似这样的操作(word)/NNP (word)/NPP
这将在一个组中返回两个元素,但不是作为单个文本,因此通过删除它,文本将是word word
,因此REGEX((?:\w+\s)+)
将捕获单词的序列,但它不像这是因为我们需要捕获结尾不包含/sequence_of_letter
的单词,不需要循环匹配的组来连接元素以构建有效的文本。你知道吗注意:如果所有单词都是这种格式
word/sequence_of_letters
;如果您的单词不是这种格式,这两种解决方案都可以正常工作 你得把它们修好。如果要保留它们,请在每个单词的末尾添加/NPP
,否则请添加/DUMMY
以删除它们。你知道吗使用
re.split
但速度较慢,因为我使用list comprehensive
修复结果:IIUC,
itertools.groupby
更适合这种工作:输出:
如果您希望有三个或更多连续类型,则不需要修改:
输出:
你想得到一个模式,但删除了一些部分。 你可以用两个连续的正则表达式得到它:
相关问题 更多 >
编程相关推荐