从Python列表中删除字符串中的所有单词

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

目前:

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

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

输入:

In: "The quick brown fox jumped over an ant"

输出:"quick brown fox jumped over t"

期望的输出:"quick brown fox jumped over"

我尝试将字符串更改为以下内容,但没有成功:
 regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE)

任何建议或者我是错过了一些非常明显的东西吗?

大概你的删除列表中包含了 ant 吧? - Martijn Pieters
2个回答

19

这里有一个建议,可以考虑不使用正则表达式:

>>> 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'

Groovy。没想到这个,谢谢 :) - Ogre
值得指出的是,这将在标点符号方面存在困难,并且不会保留制表符/连续空格(不确定后者是否重要)。 - NPE
3
值得注意的是,如果remove_list很大,最好使用remove_set = {'word1','word2',...},因为集合具有更快的成员测试速度。 - Gareth Latty
@NPE 你说得对。我们不知道 OP 的确切用途,所以我认为他们可能想考虑一下。 - jurgenreza

14

一个问题是只有第一个\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

2
作为发现这个问题的技巧(除了事先知道这个问题),可以使用 regex.pattern 输出模式。 - nhahtdh
稍微简洁一些,仍然使用f-strings:re.compile(fr"\b({remove})\b") - Pablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接