Python 3中str.translate的自定义表

时间:2018-09-20 07:40:43

标签: python string replace

如果我运行以下代码:

s.translate(str.maketrans({'as': 'dfg', '1234': 'qw'}))

我会得到:

ValueError: string keys in translate table must be of length 1

是否可以使用str.translate一次替换多个字符? Docs说我可以使用codecs来实现灵活的方法,但是我找不到方法。

如果没有,那该怎么办呢?

2 个答案:

答案 0 :(得分:2)

str.translate可以唯一用于替换单个字符。 替换字符串可以是任何长度,但是必须是单个字符。


当他们的文档中提到codecs时,他们就是说您可以实现自定义编码,注册它,然后使用它打开文件...这与调用codecs.maketrans之类的问题无关,相当多的工作。我个人将re.sub与功能替换一起使用:

replacements = {'as': 'dfg', '1234': 'qw'}
re.sub('({})'.format('|'.join(map(re.escape, replacements.keys()))), lambda m: replacements[m.group()], text)

您似乎想做什么:

>>> re.sub('({})'.format('|'.join(map(re.escape, replacements.keys()))), lambda m: replacements[m.group()], "test as other test1234")
'test dfg other testqw'

答案 1 :(得分:1)

字符串的translate方法根据您提供的翻译用字符串替换一个字符。

以下是几种情况:

Original string: as 1234
Error in [s.translate(str.maketrans({'as': 'dfg', '1234': 'qw'}))]
Error in [s = s.translate(str.maketrans({'a': 'd', '12': 'q'}))]
s.translate(str.maketrans({'a': 'd', '1': 'q'})): ds q234

获取结果的解决方法

修改问题后,以下是获得所需替代品的解决方案:

按键分割,然后按翻译词典中的值连接。

Replaced all subsrings: dfg qw

代码:

s = 'as 1234'
print('Original string:',s)
try:
    w = s.translate(str.maketrans({'as': 'dfg', '1234': 'qw'}))
    print("s.translate(str.maketrans({'as': 'dfg', '1234': 'qw'}):", w)
except:
    print("Error in [s.translate(str.maketrans({'as': 'dfg', '1234': 'qw'}))]")
try:   
    w = s.translate(str.maketrans({'a': 'd', '12': 'q'}))
    print("s.translate(str.maketrans({'a': 'd', '12': 'q'})):", w)
except:
    print("Error in [s = s.translate(str.maketrans({'a': 'd', '12': 'q'}))]")
try:   
    w = s.translate(str.maketrans({'a': 'd', '1': 'q'}))
    print("s.translate(str.maketrans({'a': 'd', '1': 'q'})):", w)
except:
    print("Error in [s = s.translate(str.maketrans({'a': 'd', '1': 'q'}))]")

trans_dict = {'as': 'dfg', '1234': 'qw'}
for k,v in trans_dict.items():
    y = s.split(k)
    s = v.join(y)
print('Replaced all subsrings:',s)