Python中的字符串替换列表

44 投票
8 回答
80467 浏览
提问于 2025-04-15 11:10

有没有更简短的方法来写下面的代码呢?

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)

撰写回答