Кастомная таблица для str.translate в Python 3 - PullRequest
0 голосов
/ 20 сентября 2018

Если я выполню этот код:

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

Я получу:

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

Есть ли способ заменить несколько символов одновременно, используя str.translate?Документы говорят, что я могу использовать codecs для гибкого подхода, но я не могу понять, как.

Если нет, что можно сделать вместо этого?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Метод 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)
0 голосов
/ 20 сентября 2018

Нет .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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...