我有一个单词列表和一个字符串,并且想从原始列表中取回在字符串中找到的单词列表。
例如:
import re
lof_terms = ['car', 'car manufacturer', 'popular']
str_content = 'This is a very popular car manufacturer.'
pattern = re.compile(r"(?=(\b" + r"\b|".join(map(re.escape, lof_terms)) + r"\b))")
found_terms = re.findall(pattern, str_content)
这只会返回 ['car', 'popular']。它未能捕获“汽车制造商”。但是,如果我将术语源列表更改为
lof_terms = ['汽车制造商', '流行']
不知何故,“汽车”和“汽车制造商”之间的重叠似乎是此问题的根源。
有什么办法可以克服这个问题吗?
非常感谢
最佳答案
如果您首先按长度降序对 lof_terms
进行排序,则可以修复当前代码:
rx = r"(?=\b({})\b)".format("|".join(map(re.escape, sorted(lof_terms, key=len, reverse=True))))
pattern = re.compile(rx)
请注意,在这种情况下,\b
字边界仅在分组的任一端使用一次,无需在每个替代项周围重复它们。请参阅this regex demo .
请参阅Python demo :
import re
lof_terms = ['car', 'car manufacturer', 'popular']
str_content = 'This is a very popular car manufacturer.'
rx = r"(?=\b({})\b)".format("|".join(map(re.escape, sorted(lof_terms, key=len, reverse=True))))
pattern = re.compile(rx)
found_terms = re.findall(pattern, str_content)
print(found_terms)
# => ['popular', 'car manufacturer']
关于Python正则表达式匹配列表中的多个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65290426/