如何在字符串中同时替换两个东西?
假设我有一个字符串,"ab"
。
我想把里面的 "a"
替换成 "b"
,同时把 "b"
替换成 "a"
,希望一次性完成。
最后,字符串应该变成 "ba"
,而不是 "aa"
或 "bb"
,而且只用一行代码。这样可以做到吗?
6 个回答
7
如果你觉得两行代码可以接受的话,这样写会更简洁美观。
d={'a':'b','b':'a'}
''.join(d[s] for s in "abaababbd" if s in d.keys())
26
import string
"abaababb".translate(string.maketrans("ab", "ba"))
# result: 'babbabaa'
请注意,这种方法只适用于替换单个字符。
如果要替换更长的字符串或者多个字符,这就有点复杂了,但可能还是能用:
import re
def replace_all(repls, str):
# return re.sub('|'.join(repls.keys()), lambda k: repls[k.group(0)], str)
return re.sub('|'.join(re.escape(key) for key in repls.keys()),
lambda k: repls[k.group(0)], str)
text = "i like apples, but pears scare me"
print replace_all({"apple": "pear", "pear": "apple"}, text)
不幸的是,如果你使用了正则表达式中的特殊字符,这种方法就不行了 :(
(感谢 @TimPietzcker)
51
当你需要交换两个变量,比如 x 和 y 时,常用的方法是引入一个临时变量 t 来帮助交换:t = x; x = y; y = t
。
这个方法也可以用在字符串上:
>>> # swap a with b
>>> 'obama'.replace('a', '%temp%').replace('b', 'a').replace('%temp%', 'b')
'oabmb'
这个技巧并不是新鲜事。它在 PEP 378 中被描述为一种在美式和欧式小数点及千位分隔符之间转换的方法(比如从 1,234,567.89
转换为 1.234.567,89
)。Guido 也认为这是一个合理的技巧。