Вы можете закодировать x-escape-последовательности, используя re.sub
.
Прежде всего, определите регулярное выражение, которое будет захватывать эти последовательности.
import re
pattern = re.compile(r'\\x[0-9a-fA-f]{2}') # matches \x and two-digit hex value
Обратите внимание, что \x
необходимо экранировать, чтобы компилятор не отклонял его как фиктивную escape-последовательность.
Теперь определите функцию, которая будет кодировать соответствующие последовательности.
def enc(match):
return match.group(0).decode('string-escape').encode('hex')
При кодировании нам нужно сначала декодировать из 'escape-строки', потому что нам нужно экранировать входную строку, чтобы последовательности \x..
были сопоставлены.
Теперь выполните подстановку на экранированную строкуверсия входной строки, помня о декодировании выходных данных (в противном случае последовательности, такие как \n
, будут экранированы):
s = 'abc\x1a\x01def'
escaped = re.sub(pattern, enc, s.encode('string-escape'))
result = escaped.decode('string-escape')
print result
abc1a01def