2012-02-18 15 views
6

Powiedz, mam ciąg w Pythonie 3.2 jak poniżej:Unescaping uciekł znaków w ciąg przy użyciu Python 3.2

'\n' 

Kiedy print() to do konsoli, to pokazuje, jak nowej linii, oczywiście. To, czego chcę, to móc wydrukować ją dosłownie jako ukośnik odwrotny, a następnie n. Co więcej, muszę to zrobić dla wszystkich znaków zbiegających się, takich jak \ t. Więc szukam unescape function(), że w ogólnym przypadku, będzie działać w następujący sposób:

>>> s = '\n\t' 
>>> print(unescape(s)) 
'\\n\\t' 

Jest to możliwe w Pythonie bez konstruowania słownika uciekły znaków do ich dosłownych zamienniki?

(w przypadku ktoś jest zainteresowany, powód Robię to dlatego, że muszę przekazać ciąg do zewnętrznego programu w linii poleceń Program ten rozumie wszystkie standardowe sekwencje.).

+0

Kiedy mówisz „jeden wiersz poleceń” I załóżmy, że faktycznie masz na myśli przez stdout, w takim przypadku program, do którego przekazujesz dane, powinien zużywać '\ n', etc ... bez żadnych problemów. Oznacza to, że jeśli wydrukowałeś dane po ich przejściu do tego drugiego programu, zobaczyłbyś, że '\ n' nadal tam będzie. Chyba, że ​​naprawdę chcesz tego uniknąć. Ale najpierw sprawdź, czy Twoje usunięcie dodatkowego "\" w drugim programie prawdopodobnie spowoduje błąd. – Endophage

+0

Mam program wiersza poleceń o nazwie myutility. Oczekuje się, że będzie nazywane tak: 'myutility -i \ n' Jeśli nie rozwiążę łańcucha znaków, to nigdy nie zobaczę, że \ n zostanie do niego przekazany - to przyjmie, że -i będzie pustym argument. –

Odpowiedz

11

Aby zapobiec specjalnemu traktowaniu \ w ciągu literału, można użyć przedrostka r:

s = r'\n' 
print(s) 
# -> \n 

Jeśli masz ciąg znaków, który zawiera symbol nowej linii (ord(s) == 10) i chcesz go przekonwertować do postaci nadającej się jako Python dosłowny:

s = '\n' 
s = s.encode('unicode-escape').decode() 
print(s) 
# -> \n 
+0

niesamowite, bardzo użyteczne i dobry przykład kodowania/dekodowania – OregonTrail

5

Edit: Na podstawie twojej ostatniej uwagi, prawdopodobnie chcesz dostać się z Unicode do jakiejś zakodowanej reprezentacji. Jest to jeden ze sposobów:

>>> s = '\n\t' 
>>> s.encode('unicode-escape') 
b'\\n\\t' 

Jeśli ich nie trzeba uciekł następnie użyć kodowania systemu, np

>>> s.encode('utf8') 
b'\n\t' 

Można użyć tego w podproces:

import subprocess 
proc = subprocess.Popen([ 'myutility', '-i', s.encode('utf8') ], 
         stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
         stderr=subprocess.STDOUT) 
stdout,stderr = proc.communicate() 
+2

Chociaż 'repr()' jest naprawdę atrakcyjne, to _może_nie być dokładnie tym, co jest zamierzone, ponieważ będzie ono wyprowadzać ciąg zawierający pojedyncze cytaty, więc skończysz z czymś w stylu '' '\\ n \\ r "". – voithos

+0

Mój Python ocenia to jako "" \\ n \\ t "" Chyba mogę po prostu usunąć pierwsze i ostatnie znaki ...? –

+2

@MikeyCee: Zobacz edycję, aby uzyskać lepszą opcję. – bernie

Powiązane problemy