与php类似的函数';python中的str_替换?

与php类似的函数';python中的str_替换?,python,Python,python中是否有类似的函数将搜索(数组)和替换(数组)作为参数?然后从每个数组中获取一个值,并使用它们对主题(字符串)进行搜索和替换 我知道我可以使用for循环来实现这一点,但只是看起来更优雅而已。我相信答案是否定的 我将在列表中指定搜索/替换字符串,并在其上迭代: edits = [(search0, replace0), (search1, replace1), (search2, replace2)] # etc. for search, replace in edits: s

python中是否有类似的函数将搜索(数组)和替换(数组)作为参数?然后从每个数组中获取一个值,并使用它们对主题(字符串)进行搜索和替换


我知道我可以使用for循环来实现这一点,但只是看起来更优雅而已。

我相信答案是否定的

我将在列表中指定搜索/替换字符串,并在其上迭代:

edits = [(search0, replace0), (search1, replace1), (search2, replace2)] # etc.
for search, replace in edits:
    s = s.replace(search, replace)
即使python确实有一个
str_replace
-风格的函数,我想我还是会将搜索/替换字符串作为一个列表分开,所以实际上这只需要额外的一行代码

最后,这毕竟是一种编程语言。如果它不能提供您想要的功能,您可以自己定义它。

使用regexp执行:

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"

使用regexps可以加快搜索速度。这不会重复地用进一步的替换替换替换,这通常是需要的。

嘿-您可以使用下面的一个衬里,其优雅程度仅次于其方便性:-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!'

为此制作了一个小小的递归函数

def str_replace(sbjct, srch, rplc):
    if len(sbjct) == 0:
        return ''

    if len(srch) == 1:
        return sbjct.replace(srch[0], rplc[0])

    lst = sbjct.split(srch[0])
    reslst = []
    for s in lst:
        reslst.append(str_replace(s, srch[1:], rplc[1:]))
    return rplc[0].join(reslst);

是的,你说得对。但是内置函数往往效率更高。这个解决方案的问题是编辑#2可能会替换之前编辑插入的内容,我希望这是绝对可以避免的。@kaizer.se:是的,这是真的。我不懂PHP,但会说:“如果搜索或替换是数组,那么它们的元素将从第一个到最后一个进行处理。”我认为,仅替换不重叠的搜索字符串将是一个困难的问题。@Ainab:当然,但记住他们关于过早优化的说法。我希望这个简单的代码在大多数情况下都足够快。如果您已经分析了它,并且您需要更高的速度,那么您可以问另一个问题:“我如何提高速度?”请参阅前面的:Neat。Itertools可以更好地继续序列:
def cont(seq,elem=None):返回Itertools.chain(seq,Itertools.repeat(elem))
;现在使用
cont(替换“”)