Python从pos序列中搜索特定的单词序列并突出显示它

时间:2015-03-20 08:39:09

标签: python regex

假设我们有这样的句子,

 string = "He/PRP has/VBZ some/DT well/RB made/VBN clothes/NNS made/VBN by/IN a/DT Italian/JJ American/JJ tailor/NN in/IN the/DT Italian/JJ club/NN ./."

我有一个要突出显示的复合词列表。

target = ['He', 'wellmade', 'ItalianAmerican']

我希望得到的结果如下所示。

"[He/PRP] has/VBZ some/DT [well/RB made/VBN] clothes/NNS made/VBN by/IN a/DT [Italian/JJ American/JJ] tailor/NN in/IN the/DT Italian/JJ club/NN ./."

假设每个目标项的长度与句子中的相应标记相同或更长。我想我应该首先发现与目标项对应的跨度,然后插入括号,但我无法将其实现为代码。请给我一些提示。谢谢!

2 个答案:

答案 0 :(得分:0)

很容易出现“问题”,因为它是一个在输入字符串中分割的复合词,即使附加了后缀,也会出现问题。[' he'我建议您将target项目转换为带有可选组的正则表达式模式:(?:\/[A-Z]+\s*|\s)?应插入每个字母后但最后一个字母,(?:\/[A-Z]+)?应在最后一个字母后插入。

查看ItalianAmerican的示例正则表达式:

I(?:\/[A-Z]+\s*|\s)?t(?:\/[A-Z]+\s*|\s)?a(?:\/[A-Z]+\s*|\s)?l(?:\/[A-Z]+\s*|\s)?i(?:\/[A-Z]+\s*|\s)?a(?:\/[A-Z]+\s*|\s)?n(?:\/[A-Z]+\s*|\s)?A(?:\/[A-Z]+\s*|\s)?m(?:\/[A-Z]+\s*|\s)?e(?:\/[A-Z]+\s*|\s)?r(?:\/[A-Z]+\s*|\s)?i(?:\/[A-Z]+\s*|\s)?c(?:\/[A-Z]+\s*|\s)?a(?:\/[A-Z]+\s*|\s)?n(?:\/[A-Z]+)?

查看demo example

答案 1 :(得分:0)

这是你在找什么?

import re
re.sub(r'((?:He|well.*?made|Italian.*?American).*?)(\s)', r'[\1]\2', string)