Python字符串一次替换两件事?

Wha*_*ame 33 python string

说我有一个字符串,"ab"

我想用"a"将"a"替换为"a",将"b"替换为"a".

所以结束字符串应该说"ba"而不是"aa"或"bb"而不是使用多行.这可行吗?

Ray*_*ger 46

当你需要交换变量时,比如xy,一个常见的模式是引入一个临时变量t来帮助交换: t = x; x = y; y = t.

相同的模式也可以用于字符串:

>>> # swap a with b
>>> 'obama'.replace('a', '%temp%').replace('b', 'a').replace('%temp%', 'b')
'oabmb'
Run Code Online (Sandbox Code Playgroud)

这种技术并不新鲜.它在PEP 378中被描述为一种在美国和欧洲风格的十进制分隔符和千位分隔符之间进行转换的方式(例如从... 1,234,567.891.234.567,89Guido)认可这是一种合理的技术.

  • 每个人都可以接受这样的事实:包含%temp%的任何字符串都会被错误地更改吗? (3认同)

Ama*_*dan 21

import string
"abaababb".translate(string.maketrans("ab", "ba"))
# result: 'babbabaa'
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于单字符替换.

对于更长的子串或替换,这有点复杂,但可能有效:

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果你包含任何正则表达式特殊字符,你不能使用正则表达式,这将无法正常工作 :(

(谢谢@TimPietzcker)


Abh*_*jit 7

如果你对两条线路没问题,那就更优雅了.

d={'a':'b','b':'a'}
''.join(d[s] for s in "abaababbd" if s in d.keys())
Run Code Online (Sandbox Code Playgroud)

  • `''.join(d [s]如果在"abaababbd"中s为s,则s为s) (7认同)
  • `''.join(d.get(s,s) for s in "abaababbd")` (2认同)