Возможно перевести код в рег. выражение 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'))
Да, возможно. 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 их экранирует чтобы не было неожиданностей.
У тебя слишком много кода:
>>> tr=str.maketrans(dict(zip('AEIO', '4310')))
>>> 'SINGAPORE'.translate(tr)
'S1NG4P0R3'