2016-11-06 23 views
5

Chciałbym zwrócić ten ciąg:usunąć znak ucieczki z ciągiem

a = '\\a' 

do tej jednej

b = '\a' 

To nie wydaje się tam jest oczywistym sposobem, aby to zrobić z replace?

EDIT: Aby być bardziej precyzyjnym, chcę zmienić cytowanie ukośnik uciec postać a

+1

'\\' jest po prostu sposobem na umieszczenie odwrotnego ukośnika w ciągu znaków. '\ a' oznacza, że ​​uciekasz z' a'. Aby tego uniknąć, musisz uciec przed specjalnym znaczeniem odwrotnego ukośnika, umieszczając przed nim drugi ukośnik odwrotny. Python wypisuje go jako '\\ a', ale w rzeczywistości jest to tylko dwie litery: odwrócony ukośnik i" a ". –

+1

spróbuj 'print (a)'. – inspectorG4dget

+0

Czy używasz Python 2 lub Python 3? –

Odpowiedz

5

Znak '\ a' jest ASCII BEL character, Chr (7).

Aby wykonać konwersję w Pythonie 2:

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

wyjście

'\\a' '\x07' 

A na przyszłość, w Pythonie 3:

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

To daje identyczną wyjście do powyższy fragment.

W Pythonie 3, jeśli pracowali z bajtów obiektów chcesz zrobić coś takiego:

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

wyjściowy

b'\\a' b'\x07' 

Jak wspomina Antti Haapala, to prosta strategia dla Pythona 3 nie zadziała, jeśli łańcuch źródłowy zawiera również znaki Unicode. W takim przypadku zobacz odpowiedź na bardziej niezawodne rozwiązanie.

1

Unescape string jest to, czego szukał, aby znaleźć to:

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

to sposób, aby to zrobić z Unicode. Skoro jesteś w Pythonie 2 i nie może być przy użyciu Unicode, to może rzeczywiście jednym:

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

W Pythonie 2 można użyć

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

Uwaga jak \a jest repr'd jak \x07.

Jeśli ciąg znaków jest ciągiem znaków Unicode z rozszerzonymi znakami, najpierw należy go rozszyfrować do wartości bytestringu, w przeciwnym razie domyślne kodowanie (ascii!) Zostanie użyte do przekonwertowania obiektu unicode na pierwszy test.


Jednak ten kodek nie istnieje w Pythonie 3, a rzeczy są znacznie bardziej skomplikowane.Można użyć unicode-escape rozszyfrować, ale jest bardzo uszkodzony, jeśli ciąg źródłowy zawiera znaki Unicode też:

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

Powstały ciąg nie składa się z znaków Unicode ale bajtów dekodowany jako Latin-1. Rozwiązaniem jest ponowne kodowanie do łacińskiego-1, a następnie dekodowanie ponownie jako utf8:

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