【问题标题】:Remove all occurrences of words in a string from a python list从 python 列表中删除字符串中所有出现的单词
【发布时间】:2026-01-29 21:20:04
【问题描述】:

我正在尝试使用已编译的正则表达式从字符串中匹配和删除列表中的所有单词,但我正在努力避免单词中出现。

当前:

 REMOVE_LIST = ["a", "an", "as", "at", ...]

 remove = '|'.join(REMOVE_LIST)
 regex = re.compile(r'('+remove+')', flags=re.IGNORECASE)
 out = regex.sub("", text)

在:“敏捷的棕狐跳过一只蚂蚁”

出:“快棕狐跳过t”

预期:“快速的棕狐跳过”

我尝试将字符串更改为以下内容,但无济于事:

 regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE)

有什么建议还是我遗漏了一些很明显的东西?

【问题讨论】:

  • 大概ant 是您删除列表的一部分?

标签: python regex


【解决方案1】:

这是一个您可能需要考虑的不使用正则表达式的建议:

>>> sentence = 'word1 word2 word3 word1 word2 word4'
>>> remove_list = ['word1', 'word2']
>>> word_list = sentence.split()
>>> ' '.join([i for i in word_list if i not in remove_list])
'word3 word4'

【讨论】:

  • 时髦。没想到。谢谢:)
  • 值得指出的是,这将难以使用标点符号,并且不会保留制表符/连续空格(不确定后者是否重要)。
  • 值得注意的是,如果remove_list 很大,您最好使用remove_set = {'word1', 'word2', ...},因为集合具有更快的成员资格测试。
  • @NPE 你是对的。我们不知道 OP 的确切用法,所以我认为他们可能想要考虑它。
【解决方案2】:

一个问题是只有第一个\b 在原始字符串中。第二个被解释为退格字符 (ASCII 8) 而不是单词边界。

修复,改变

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE)

regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE)
                                 ^ THIS

【讨论】:

  • 作为发现这一点的技巧(除了事先知道这一点),使用regex.pattern输出模式