字符串替换可以写在列表理解中吗?

Can string replace be written in list comprehension?

我有一个文本和一个列表。

text = "Some texts [remove me] that I want to [and remove me] replace"
remove_list = ["[remove me]", "[and remove me]"]

我想替换字符串中列表中的所有元素。所以,我可以这样做:

for element in remove_list:
    text = text.replace(element, '')

我也可以使用正则表达式。 但这可以在列表理解或任何单行中完成吗?

您可以使用 functools.reduce:

from functools import reduce

text = reduce(lambda x, y: x.replace(y, ''), remove_list, text)
# 'Some texts  that I want to  replace'

您可以使用正则表达式执行此操作,方法是根据要删除的单词的交替构建正则表达式,注意转义字符串,以便其中的 [] 不会被视为特殊字符:

import re

text = "Some texts [remove me] that I want to [and remove me] replace"
remove_list = ["[remove me]", "[and remove me]"]

regex = re.compile('|'.join(re.escape(r) for r in remove_list))

text = regex.sub('', text)
print(text)

输出:

Some texts  that I want to  replace

由于这可能会导致结果字符串中出现双空格,您可以使用 replace 删除它们,例如

text = regex.sub('', text).replace('  ', ' ')

输出:

Some texts that I want to replace

我会用 re.sub 来一次删除所有子字符串:

>>> import re
>>> regex = '|'.join(map(re.escape, remove_list))
>>> re.sub(regex, '', text)
'Some texts  that I want to  replace'

请注意,结果有两个 space,而不是每个部分都被删除的结果。如果你希望每次出现只留下一个 space,你可以使用稍微复杂一点的正则表达式:

>>> re.sub(r'\s*(' + regex + r')', '', text)
'Some texts that I want to replace'

还有其他方法可以编写类似的正则表达式;这个将删除匹配前的 space,但您也可以删除匹配后的 space。您想要哪种行为取决于您的用例。