2016-11-06 8 views
5

Я хотел бы, чтобы превратить эту строку:удалить экранирующий символ из строки

a = '\\a' 

в одну эту

b = '\a' 

Это не похоже, есть очевидный способ сделать это с replace?

EDIT: Чтобы быть более точным, я хочу, чтобы изменить вытекание из обратной косой черты, чтобы избежать персонажу a

+1

'\\' - это всего лишь способ поместить обратную косую черту в строку. '\ a' означает, что вы избегаете' a'. Чтобы этого избежать, вам нужно избежать особого значения обратной косой черты, поставив перед ним вторую обратную косую черту. Python печатает его как '\\ a', но на самом деле это всего два символа: обратная косая черта и' a'. –

+1

попробуйте 'print (a)'. – inspectorG4dget

+0

Вы используете Python 2 или Python 3? –

ответ

5

Символ «\ а» является ASCII BEL character, CHR (7).

Чтобы выполнить преобразование в Python 2:

from __future__ import print_function 
a = '\\a' 
c = a.decode('string-escape') 
print(repr(a), repr(c)) 

выход

'\\a' '\x07' 

И для дальнейшего использования, в Python 3:

a = '\\a' 
b = bytes(a, encoding='ascii') 
c = b.decode('unicode-escape') 
print(repr(a), repr(c)) 

Это дает идентичный выход на приведенный выше фрагмент.

В Python 3, если вы работали с байтами объекты вы могли бы сделать что-то вроде этого:

a = b'\\a' 
c = bytes(a.decode('unicode-escape'), 'ascii') 
print(repr(a), repr(c)) 

выход

b'\\a' b'\x07' 

Как отмечает Антти Haapala, эта простая стратегия для Python 3 не будет работать, если строка источника содержит символы Unicode. В этом случае, пожалуйста, см. Его ответ для более надежного решения.

1

Unescape string является то, что я искал, чтобы найти это:

>>> a = r'\a' 
>>> a.encode().decode('unicode-escape') 
'\x07' 
>>> '\a' 
'\x07' 

Это способ сделать это с юникода. Поскольку вы находитесь в Python 2 и не может быть использовать Юникод, вы можете на самом деле один:

>>> a.decode('string-escape') 
'\x07' 
5

На Python 2 вы можете использовать

>>> '\\a'.decode('string_escape') 
'\x07' 

\a Обратите внимание, как это repr'd в \x07.

Если строка представляет собой строку юникода с расширенными символами, сначала необходимо сначала декодировать ее в байтовое кодирование, в противном случае сначала используется кодировка по умолчанию (ascii!) Для преобразования объекта unicode в байтовую строку.


Однако этот кодек не существует в Python 3, и все гораздо сложнее.Вы можете использовать unicode-escape для декодирования, но очень нарушенным, если строка содержит источник Юникода тоже:

>>> '\aäầ'.encode().decode('unicode_escape') 
'\x07äầ' 

Результирующая строка не состоит из символов Unicode, а байты декодируется как Latin-1. Решение заключается в повторном кодировании на латинский-1, а затем снова декодировать как utf8:

>>> '\\aäầ\u1234'.encode().decode('unicode_escape').encode('latin1').decode() 
'\x07äầሴ' 
Смежные вопросы