2009-04-18 163 views
22

有没有更简短的方法来编写下面的代码?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

回答

44

看起来像使用循环的好机会:

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) 
+1

这很奇怪;这就是我写它的方式,因为问题是关于从一个角色到另一个角色的映射。 但实际上,你并没有使用字典作为字典,你使用它作为元组列表。那么为什么不首先写一个元组列表呢? – 2009-04-19 22:47:50

+0

当然,元组列表也可以工作(并且速度更快)。我将编辑答案以包含该选项。 – 2009-04-20 16:05:00

+2

如果你有这个映射{'A':'1','1':'A'},那么结果可能与预期的不一样 – muni764 2015-09-17 22:24:20

6
replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}  
for key, replacement in replaceDict.items(): 
    my_string = my_string.replace(key, replacement)
15

也查看str.translate()。它根据您为Unicode字符串提供的映射来替换字符,或者必须告诉用什么来替换从chr(0)到chr(255)的每个字符。

35

您可以轻松地使用string.maketrans()创建映射的字符串传递给str.translate():

import string 
trans = string.maketrans("ABCDE","12345") 
my_string = my_string.translate(trans) 
10

如果你想要得到错误的答案,慢慢地,然后用与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。

1

我这样做的一种方式是关联数组(字典)。以下是在使用正则表达式获取准备在LaTeX中部署的文件时使用的替换示例。

import re 
    def escapeTexString(string): # Returns TeX-friendly string 
    rep = { # define desired replacements in this dictionary (mapping) 
     '&': '\\&', 
     '%': '\\%', 
     '#': '\\#', 
     '_': '\\_', 
     '{': '\\{', # REGEX Special 
     '}': '\\}', # REGEX Special 
     '~': '\\char"007E{}', # LaTeX Special 
     '$': '\\$', # REGEX Special 
     '\\': '\\char"005C{}', # REGEX/LaTeX Special 
     '^': '\\char"005E{}', # REGEX/LaTeX Special 
     '"': '\\char"FF02{}' 
     } 
    # use these two lines to do the replacement (could be shortened to one line) 
    pattern = re.compile("|".join(map(re.escape,rep.keys()))) # Create single pattern object (key to simultaneous replacement) 
    new_string = pattern.sub(lambda match: rep[match.group(0)], string) 
    return new_string