python中是否有一个类似的函数,它将search(array)和replace(array)作为参数?然后从每个数组中获取一个值,并使用它们进行搜索并替换主题(字符串)。
我知道我可以使用for循环实现这一点,但只是看起来更优雅。
答案 0 :(得分:12)
我相信答案是否定的。
我会在列表中指定您的搜索/替换字符串,并迭代它:
edits = [(search0, replace0), (search1, replace1), (search2, replace2)] # etc.
for search, replace in edits:
s = s.replace(search, replace)
即使python确实有str_replace
- 样式的函数,我想我仍然会将我的搜索/替换字符串作为列表分开,所以实际上这只需要额外的一行代码。
最后,这毕竟是一种编程语言。如果它不提供您想要的功能,您可以自己定义它。
答案 1 :(得分:2)
(如果我在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!'
答案 2 :(得分:1)
使用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可以快速搜索。这不会迭代地用更多替换替换替换,这通常 想要什么。
答案 3 :(得分:0)
为此
制作了一个微小的递归函数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);