#python #escaping
#python #экранирование
Вопрос:
Возможно ли взять строку и преобразовать все символы в их escape-последовательности Python?
Ответ №1:
repr()
экранирует все символы, которые необходимо экранировать
repr(string)
В стандартной библиотеке есть другие методы, такие как экранирование URI и так далее
Комментарии:
1. Есть ли способ избежать всех символов?
2. @Acorn, ты мог бы сделать что-то вроде этого
print "".join("\x" c.encode('hex') for c in "ABCDE")
Ответ №2:
Поддерживает полное экранирование обоих str
и unicode
(теперь создает самую короткую escape-последовательность):
def escape(s):
ch = (ord(c) for c in s)
return ''.join(('\xx' % c) if c <= 255 else ('\ux' % c) for c in ch)
for text in (u'u2018u2019hello thereu201cu201d', 'hello there'):
esc = escape(text)
print esc
# code below is to verify by round-tripping
import ast
assert text == ast.literal_eval('u"' esc '"')
Вывод:
u2018u2019x68x65x6cx6cx6fx20x74x68x65x72x65u201cu201d
x68x65x6cx6cx6fx20x74x68x65x72x65
Комментарии:
1. Как насчет строк, содержащих сочетание символов Unicode и стандартных символов?
2. @Acorn
unicode uABCD
escape-последовательность будет охватывать весь диапазон символов. Вы хотели как можно более короткую escape-последовательность?3. @Acorn Я обновил его, чтобы создать как можно более короткую последовательность, поэтому символы,
ord(c) <= 255
будут кодироваться какxAB
форма, даже в строке Unicode.4. @samplebias: Еще лучше! (однако вы забыли изменить выходные данные)