Шестнадцатеричная строка в питоне

Здесь я хочу заменить # на \x, но когда я печатаю h, это не дает того же результата, когда я печатаю y.decode()

у кого-нибудь есть объяснение и решение для него?

    s = "#53ule#69#6dan"
y = "\x53ule\x69\x6dan"
f = s.replace("#","\\x")
print f
h = f.decode()
print h
print y.decode()

2 ответа

Решение

\x в y не является действительным символом обратной косой черты, за которым следует x характер, а скорее начало escape-последовательности.

Вся последовательность "\x53" является "S" (так как "S" является 0x53 в ASCII). Так же, "\x69" является "i" а также "\x6d" является "m",

Когда вы делаете свой replace призыв к вычислению f, вы не получаете escape-последовательность, а скорее символ обратной косой черты, за которым следует x персонаж.

Я не уверен, что есть совершенно прямой способ перейти от шестнадцатеричной строки к обычной, но эта подстановка регулярных выражений добьется цели с некоторой помощью int а также chr:

re.sub("#(..)", lambda match: chr(int(match.group(1), 16)), s)
re.sub("#([A-Fa-f0-9]{2})",lambda m:unichr(int(m.groups()[0],16)),"#53ule#69#6dan")

может быть то, что вы ищете...

Другие вопросы по тегам