У меня есть строка, в которой все символы Юникода заменены их целочисленными значениями и заключены в квадратные скобки. Например, символ é был заменен на [233]. Я хочу преобразовать эти целые числа обратно в символы Юникода (и избавиться от скобок, очевидно). Я думал, что самый простой способ - использовать простую замену регулярных выражений (используя библиотеку re
), но я получаю ошибку.
Вот простой пример, который не работает:
s = 'Som[233] string'
re.sub(r'\[(\d+)\]', chr(int(r'\1')), s)
Это возвращает ошибку:
ValueError: недопустимый литерал для int () с основанием 10: '\\ 1'
Обратите внимание, что я получаю то же самое, используя решение из этого связанного вопроса.
Ошибка предполагает, что строка \\1
передается в int()
вместо фактической группы захвата.
Согласно документации :
Если repl является функцией, она вызывается для каждого непересекающегося
появление шаблона. Функция принимает один объект сопоставления
аргумент и возвращает строку замены.
Итак, я попробовал это, следуя примеру в документации:
def replace(match):
return chr(int(match.group(0)))
re.sub(r'\[(\d+)\]', replace, s)
Но это возвращает похожую ошибку:
ValueError: недопустимый литерал для int () с основанием 10: '[233]'
Что мне здесь не хватает? Почему список передается функции вместо группы захвата?