【问题标题】:List of strings, replace all words from other list [duplicate]字符串列表,替换其他列表中的所有单词[重复]
【发布时间】:2018-11-09 16:57:21
【问题描述】:

这里是 Python 新手。

我有一个文档列表和另一个搜索词列表。我现在想遍历每个文档,并将所有出现的任何搜索词替换为 <placeholder> 之类的内容。但是,它应该只匹配完整的单词,所以text.replace 可能不起作用?

所以,是这样的:

document_list =  ['I like apples', 'I like bananas', 'I like apples and bananas and pineapples', 'I like oranges, but not blood oranges.']
search_list = ['apples', 'bananas', 'blood oranges']

Out: ['I like <placeholder>', 'I like <placeholder>', 'I like <placeholder> and <placeholder> and pineapples', 'I like oranges, but not <placeholder>.']

现在,我有类似的东西

for document in document_list:
    for term in search_list:
        document = re.sub(r'\b{}\b'.format(term),'<placeholder>',document)

这似乎可行,但确实(我的意思是真的)很慢。如果我要在大约 10k 文档的完整数据集上运行它,并且 search_list 可能有大约 5k 术语,需要几天时间才能完成。 有没有更好的方法来解决这个问题并使其更快?

提前非常感谢!

Edit1:也许值得一提的是search_list中的术语也可以由多个单词组成。相应地编辑了示例。

Edit2:感谢您指向另一个线程,以前没有找到那个。对于那个很抱歉。如下所述,我仍然很想听听其他非正则表达式的解决方案,只是为了了解它们。不过,实际问题已通过另一个线程解决。 =)

【问题讨论】:

  • 您愿意接受非正则表达式解决方案吗?
  • 当然,我愿意接受任何最有效的方法。正则表达式只是我想到的第一件事(也是唯一一件)。

标签: python regex list replace


【解决方案1】:

这是一种可能性:

import re

document_list =  ['I like apples', 'I like bananas', 'I like apples and bananas and pineapples']
search_list = ['apples', 'bananas']

search_re = re.compile(r'\b(' + '|'.join(search_list) + r')\b')
replacement = r'<placeholder>'
document_replaced = [search_re.sub(replacement, doc) for doc in document_list]
print(*document_replaced, sep='\n)

输出:

I like <placeholder>
I like <placeholder>
I like <placeholder> and <placeholder> and pineapples

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 2013-03-17
    • 1970-01-01
    • 2022-12-03
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多