如何在字符串中同时替换两个东西?

40 投票
6 回答
102187 浏览
提问于 2025-04-17 09:18

假设我有一个字符串,"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

当你需要交换两个变量,比如 xy 时,常用的方法是引入一个临时变量 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 也认为这是一个合理的技巧。

撰写回答