假设我们有这样的句子,
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 ./."
假设每个目标项的长度与句子中的相应标记相同或更长。我想我应该首先发现与目标项对应的跨度,然后插入括号,但我无法将其实现为代码。请给我一些提示。谢谢!
答案 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)