Повторная замена с трансформацией - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть строка, в которой все символы Юникода заменены их целочисленными значениями и заключены в квадратные скобки. Например, символ é был заменен на [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]'

Что мне здесь не хватает? Почему список передается функции вместо группы захвата?

1 Ответ

0 голосов
/ 18 апреля 2019

Функция выше работает как положено.Второе предупреждение заключено в квадратные скобки не потому, что список возвращается, а потому, что в группу захвата 0 входит вся группа, а не только цифры:

re.search(r'\[(\d+)\]', s).group(0)
# '[233]'
re.search(r'\[(\d+)\]', s).group(1)
# '233'

Так что решение просточтобы изменить, какая группа используется в функции:

def replace(match):
    return chr(int(match.group(1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...