Поддержка Python для шестнадцатеричных экранов в тексте замены

Не удалось найти соответствующий PEP или ошибку для одной проблемы в модуле Python re.

Кто-нибудь знает, планируется ли исправить следующее?

Из regular-expressions.info:

Python не поддерживает шестнадцатеричные escape-символы в синтаксисе замещающего текста, хотя он поддерживает \xFF и ￿ в строковых константах.

Но на самом деле он поддерживает стандартные escape-последовательности, такие как \n, \r и т. д.

Так, например, нельзя заменить символ '<' на символ '>', используя шестнадцатеричные escape-последовательности:

>>> import re
>>> re.sub(r'\x3c', r'\x3e', '\x3c')
'\\x3e'

Вместо '\\x3e' должно быть '>'.

Использование экранированного \n отлично работает:

>>> re.sub(r'a', r'\n', 'a')
'\n'

Заранее спасибо!

UPD: Не использовать необработанную строку нельзя. Например, если строки шаблона и замены хранятся в файле конфигурации, поэтому, если я напишу в нем \x3e, при чтении он станет '\\x3e' вместо '>'.


person kishkin    schedule 13.03.2014    source источник


Ответы (1)


Единственный обходной путь, который я знаю, это не использовать необработанную строку для замещающего текста и вместо этого разрешить обычную оценку строки для преобразования \x3e в >. Это работает, потому что, как вы заметили, строки Python поддерживают такие последовательности.

>>> import re
>>> re.sub(r'\x3c', '\x3e', '\x3c')
'>'

Это означает, что в более сложном замещающем тексте вам нужно больше escape-последовательности, что может сделать его менее читаемым, но, по крайней мере, это работает.

Я не знаю, есть ли какие-либо планы по улучшению этого. Я просмотрел существующую документацию для модуля python 3.4 re (в разделе dev) и не нашел упоминания о включении такого рода поддержки.

Однако, если вам нужна более сложная логика замены, вы можете передать функцию вместо текста замены для аргумента repl аргумента re.sub.

person Brian    schedule 13.03.2014
comment
Привет, Брайан, спасибо за ответ! Не использовать необработанную строку не вариант. Например, если строки шаблона и замены хранятся в файле конфигурации, поэтому, если я напишу в нем \x3e, при чтении он станет '\\x3e' вместо '>'. - person kishkin; 14.03.2014
comment
Использование функции в качестве параметра repl — действительно хорошая функция, спасибо за упоминание. Я совсем забыл об этом. В любом случае вы должны использовать какой-либо метод для преобразования представлений шестнадцатеричных символов в строке в фактические символы. Я не могу придумать другого способа, кроме как использовать eval()... - person kishkin; 14.03.2014