Python中的字符串替换列表

时间:2009-04-18 22:28:07

标签: python string replace

是否有更短的方法来编写以下代码?

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 个答案:

答案 0 :(得分:54)

看起来是一个使用循环的好机会:

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 :(得分:41)

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

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

答案 2 :(得分:15)

另请参阅str.translate()。它根据您为Unicode字符串提供的映射替换字符,或者必须告知用chr(0)替换chr(255)中的每个字符的内容。

答案 3 :(得分:11)

如果你想慢慢得到错误的答案,那么在循环中使用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-或0字符替换的特殊情况,请使用string.maketrans。

答案 4 :(得分:8)

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

答案 5 :(得分:0)

我这样做的一种方法是使用相关的数组(字典)。下面是我在使用正则表达式准备好在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

答案 6 :(得分:0)

我认为这可能会更有效率:

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
my_string = "".join([mapping[c] if c in mapping else c for c in my_string])

我建议使用“ timeit”作为基准,以“ my_string”的长度为基础的实际案例。

答案 7 :(得分:0)

您可以使用Pandas在一行中完成它。

import pandas as pd

my_string="A B C test"

my_string =pd.DataFrame([my_string])[0].replace(["A","B","C","D","E"],['1','2','3','4','5'],regex=True)[0]

print(my_string)
'1 2 3 test'