2016-02-25 3 views
-1
text="\xe2\x80\x94" 
print re.sub(r'(\\(?<=\\)x[a-z0-9]{2})+',"replacement_text",text) 

выход питон регулярное выражение: как удалить шестигранные символы из строки дец

, как я могу справиться с шестигранной десятичных знаков в этой ситуации?

+1

Ваш вход не имеет * есть * обратная косая черта. Он имеет 3 байта, кодировку UTF-8 для U + 2014 EM DASH. –

+1

Чувак, 'текст' ** не ** буквально' \ xe2 \ x80 \ x94'. '\ x' - это специальный символ, который сообщает Python, что следующие два символа будут интерпретироваться как шестнадцатеричные цифры для некоторого символьного кода. – freakish

ответ

2

Ваш вход не есть обратная косая черта. Он имеет 3 байта, UTF-8 кодировку для U+2014 EM DASH характера:

>>> text = "\xe2\x80\x94" 
>>> len(text) 
3 
>>> text[0] 
'\xe2' 
>>> text.decode('utf8') 
u'\u2014' 
>>> print text.decode('utf8') 
— 

Вы либо должны соответствовать этим UTF-8 байт непосредственно или расшифровывает из UTF-8 в unicode и соответствовать элемент кода. Последнее предпочтительнее; всегда старайтесь иметь дело с текстом как Unicode, чтобы упростить, сколько символов вам нужно преобразовать за раз.

отметить также, что repr() выхода Python (который используется impliciltly когда вторя в интерактивном интерпретаторе или при печати списков, dicts или других контейнеров) использует \xhh управляющих последовательности для представления любого непечатаемую характера. Для строк UTF-8, которые включают что-либо вне диапазона ASCII. Вы можете просто заменить что-либо за пределами этого диапазона с:

re.sub(r'[\x80-\xff]+', "replacement_text", text) 

Примите во внимание, что это будет соответствовать несколько UTF-8 кодировке символов в строке и заменить их вместе как группа!

0

Ваш вход находится в шестнадцатеричном виде, а не в фактическом «\ xe2 \ x80 \ x94». \ x - это просто способ сказать, что следующие символы следует интерпретировать в шестнадцатеричном виде.

Об этом сообщается в this post.

Смежные вопросы