Удалить \ x-escape-последовательности из строки - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть шестнадцатеричная строка, и мне нужно сравнить строку, проверив, имеет ли значение '\', а затем выполнить и выполнить операцию кодирования

value='\x1a\x01'


(Pdb) value.encode("hex")
'1a01'

Однако, когда я проверяю, как это, возвращается false

(Pdb) '\\' in value
False

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете закодировать 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
...