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

9 投票
2 回答
26011 浏览
提问于 2025-04-17 19:13

我正在尝试用一个编译好的正则表达式,从一个字符串中匹配并移除一个列表里的所有单词,但我遇到了问题,就是不想把单词中间的部分也去掉。

目前的情况是:

 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)

有没有什么建议,或者我是不是漏掉了什么明显的东西?

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

一个问题是,只有第一个 \b 是在原始字符串里面。第二个 \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

撰写回答