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

Ogr*_*gre 8 python regex

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

当前:

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

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

在:"快速的棕色狐狸跳过一只蚂蚁"

出:"快速的棕色狐狸跳过了"

预计:"快速棕色狐狸跳过"

我已经尝试更改字符串以编译为以下但无济于事:

 regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

有什么建议或者我错过了一些非常明显的东西吗?

jur*_*eza 18

这里有一个不使用正则表达式的建议你可能要考虑:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果`remove_list`很大,那么你最好使用`remove_set = {'word1','word2',...}`,因为集合的成员资格测试速度要快得多. (3认同)

NPE*_*NPE 11

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

要修复,改变

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE)
                                 ^ THIS
Run Code Online (Sandbox Code Playgroud)

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