Возможно перевести код в рег. выражение Python?

def correct(s):
    mapping = str.maketrans({'0': 'O', '1': 'I', '5': 'S'})
    return s.translate(mapping)
   #return string.replace('1','I').replace('0','O').replace('5','S')

print(correct("51NGAP0RE")) #=="SINGAPORE"

Ответы (3 шт):

Автор решения: Денис Шахбазян
import re

change_sym = {'0': 'O', '1': 'I', '5': 'S'}


def correct(data):
    for k, v in change_sym.items():
        data = re.sub(k, v, data)
    return data


print(correct('51NGAP0RE'))
→ Ссылка
Автор решения: Stanislav Volodarskiy

Да, возможно. re.sub вторым аргументом принимает функцию, которая вычисляет нужную замену:

import re


def correct(s):

    def repl(m):
        return {'0': 'O', '1': 'I', '5': 'S'}[m.group(0)]

    return re.sub('[015]', repl, s)


print(correct("51NGAP0RE")) #=="SINGAPORE"

В коде выше ключи в словаре и символы в регулярном выражении дублируются. Исправляем:

import re


def make_correct(map_):
    chars = re.escape(''.join(map_.keys()))
    pattern = re.compile(f'[{chars}]')
    return lambda s: pattern.sub(lambda m: map_[m.group(0)], s)


correct = make_correct({'0': 'O', '1': 'I', '5': 'S'})
print(correct("51NGAP0RE")) #=="SINGAPORE"

P.S. Зачем нужен re.escape?

Без него карта {'0': '', '-': '', '9': ''} даст регулярное выражение [0-9], которое выбирает любые цифры, но не выбирает минус. Это не то что нужно. С re.escape получится выражение [0\-9], выбирающее ровно три символа 0, -, 9. То что надо.

Во всех случаях когда регулярное выражение формируется программно, нужно следить за символами и комбинациями символов которые имеют специальное значение в образце. re.escape их экранирует чтобы не было неожиданностей.

→ Ссылка
Автор решения: user2240578

У тебя слишком много кода:

>>> tr=str.maketrans(dict(zip('AEIO', '4310')))
>>> 'SINGAPORE'.translate(tr)
'S1NG4P0R3'
→ Ссылка