字符串替换可以写在列表理解中吗?
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。您想要哪种行为取决于您的用例。
我有一个文本和一个列表。
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。您想要哪种行为取决于您的用例。