Python中类似于PHP的str_replace的函数?

5 投票
4 回答
11338 浏览
提问于 2025-04-15 14:08

在Python中,有没有类似的函数,可以接收两个数组,一个是搜索用的数组,另一个是替换用的数组?然后这个函数可以从每个数组中取出一个值,利用这些值在一个字符串上进行搜索和替换。

我知道我可以用for循环来实现这个功能,但我想找一种更优雅的方法。

4 个回答

1

用正则表达式来实现这个:

import re

def replace_from_list(replacements, str):
    def escape_string_to_regex(str):
        return re.sub(r"([\\.^$*+?{}[\]|\(\)])", r"\\\1", str)

    def get_replacement(match):
        return replacements[match.group(0)]

    replacements = dict(replacements)
    replace_from = [escape_string_to_regex(r) for r in replacements.keys()]
    regex = "|".join(["(%s)" % r for r in replace_from])
    repl = re.compile(regex)

    return repl.sub(get_replacement, str)

# Simple replacement:
assert replace_from_list([("in1", "out1")], "in1") == "out1"

# Replacements are never themselves replaced, even if later search strings match
# earlier destination strings:
assert replace_from_list([("1", "2"), ("2", "3")], "123") == "233"

# These are plain strings, not regexps:
assert replace_from_list([("...", "out")], "abc ...") == "abc out"

使用正则表达式可以让搜索变得更快。不过,这种方法不会把替换的结果再进行进一步的替换,这通常是我们想要的效果。

2

嘿,你可以用下面这行代码,它的简洁程度仅次于它的方便性 :-P

(如果我没理解错PHP文档的话,当搜索的内容比替换的内容长时,它的表现也像PHP。)

**** 更新:这个新版本可以替换所有大小的子字符串。 ****

>>> subject = "Coming up with these convoluted things can be very addictive."
>>> search = ['Coming', 'with', 'things', 'addictive.', ' up', ' these', 'convoluted ', ' very']
>>> replace = ['Making', 'Python', 'one-liners', 'fun!']
>>> reduce(lambda s, p: s.replace(p[0],p[1]),[subject]+zip(search, replace+['']*(len(search)-len(replace))))
'Making Python one-liners can be fun!'
14

我认为答案是否定的。

我会把你要查找和替换的内容放在一个列表里,然后逐个处理:

edits = [(search0, replace0), (search1, replace1), (search2, replace2)] # etc.
for search, replace in edits:
    s = s.replace(search, replace)

即使 Python 有类似 str_replace 的函数,我觉得我还是会把查找和替换的内容分开放在一个列表里,所以这其实只多了一行代码。

最后,毕竟这是一个编程语言。如果它没有你想要的功能,你总是可以自己定义一个。

撰写回答