说我有一个字符串,"ab"
。
我希望一举将"a"
替换为"b"
,将"b"
替换为"a"
。
所以最后,字符串应该是"ba"
而不是"aa"
或"bb"
,并且不能使用多行。这可行吗?
答案 0 :(得分:42)
当你需要交换变量时,比如 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认为这是一种合理的技术。
答案 1 :(得分:20)
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)
答案 2 :(得分:7)
如果两行合适,那就更优雅了。
d={'a':'b','b':'a'}
''.join(d[s] for s in "abaababbd" if s in d.keys())
答案 3 :(得分:2)
你的例子有点抽象,但在过去我使用this recipe构建一个正则表达式来进行单次传递多次替换。这是我的调整版本:
import re
def multiple_replace(dict, text):
regex = re.compile("|".join(map(re.escape, dict.keys())))
return regex.sub(lambda mo: dict[mo.group(0)], text)
请注意,键(搜索字符串)是重新发送的。
在你的情况下,它将是:
from utils import multiple_replace
print multiple_replace({
"a": "b",
"b": "a"
}, "ab")
<强>更新强>
到目前为止,这与Amadan's answer
基本相同答案 4 :(得分:1)
>>> import re
>>> re.sub('.', lambda m: {'a':'b', 'b':'a'}.get(m.group(), m.group()), 'abc')
'bac'
答案 5 :(得分:0)
the_string="ab"
new_string=""
for x in range(len(the_string)):
if the_string[x]=='a':
new_string+='b'
continue
if the_string[x]=='b':
new_string+='a'
continue
new_string+=the_string[x]
the_string=new_string
print the_string