Python中的字符串替换列表
有没有更简短的方法来写下面的代码呢?
my_string = my_string.replace('A', '1')
my_string = my_string.replace('B', '2')
my_string = my_string.replace('C', '3')
my_string = my_string.replace('D', '4')
my_string = my_string.replace('E', '5')
请注意,我并不需要把那些具体的数值替换掉;我只是想找到一种方法,把5行以上的代码缩减到少于5行。
8 个回答
15
如果你想要慢慢得到错误的答案,那就用循环来做string.replace。(不过在这种没有重叠的模式和替换的情况下,它确实是有效的。)
对于可能有重叠或者很长的字符串的情况,建议使用re.sub:
import re
def multisub(subs, subject):
"Simultaneously perform all substitutions on the subject string."
pattern = '|'.join('(%s)' % re.escape(p) for p, s in subs)
substs = [s for p, s in subs]
replace = lambda m: substs[m.lastindex - 1]
return re.sub(pattern, replace, subject)
>>> multisub([('hi', 'bye'), ('bye', 'hi')], 'hi and bye')
'bye and hi'
对于只包含1个字符的模式和替换为1个或0个字符的特殊情况,可以使用string.maketrans。
49
你可以很简单地使用 string.maketrans() 来创建一个映射字符串,然后把它传给 str.translate() 使用:
import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
73
看起来这是一个很好的机会来使用循环:
mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
for k, v in mapping.iteritems():
my_string = my_string.replace(k, v)
如果你不介意括号的话,有一种更快的方法:
mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ]
for k, v in mapping:
my_string = my_string.replace(k, v)