2011-03-03 15 views
26

Así que no puedo entender esto ... Tengo una cadena de decir, "a\\nb" y quiero que esto se convierta en "a\nb". Intenté todo lo siguiente y ninguno parece funcionar;Python Reemplazar \ con

>>> a 
'a\\nb' 
>>> a.replace("\\","\") 
    File "<stdin>", line 1 
    a.replace("\\","\") 
        ^
SyntaxError: EOL while scanning string literal 
>>> a.replace("\\",r"\") 
    File "<stdin>", line 1 
    a.replace("\\",r"\") 
        ^
SyntaxError: EOL while scanning string literal 
>>> a.replace("\\",r"\\") 
'a\\\\nb' 
>>> a.replace("\\","\\") 
'a\\nb' 

Realmente no entiendo por qué funciona la última, porque esto funciona bien:

>>> a.replace("\\","%") 
'a%nb' 

¿Hay algo que me falta aquí?

EDIT Entiendo que \ es un personaje de escape. Lo que trato de hacer aquí es convertir todos \\n\\t etc. en \n\t etc. y reemplazar no parece funcionar de la manera que imaginaba.

>>> a = "a\\nb" 
>>> b = "a\nb" 
>>> print a 
a\nb 
>>> print b 
a 
b 
>>> a.replace("\\","\\") 
'a\\nb' 
>>> a.replace("\\\\","\\") 
'a\\nb' 

Quiero que la cadena a parezca una cuerda b. Pero reemplazar no está reemplazando barras como pensaba.

+1

su cadena original, 'a = 'una \\ nb'' en realidad no tiene dos '' \ '' caracteres, el primero es un escape para este último. Si lo haces, 'print a', verás que en realidad solo tienes un carácter' '\' '. – Santa

Respuesta

36

No hay razón para usar sustituir para esto, Python viene con pilas incluidas

Lo que tienes es una cadena codificada (utilizando la codificación string_escape) y quiere decodificarlo:

>>> s = r"Escaped\nNewline" 
>>> print s 
Escaped\nNewline 
>>> s.decode('string_escape') 
'Escaped\nNewline' 
>>> print s.decode('string_escape') 
Escaped 
Newline 
>>> "a\\nb".decode('string_escape') 
'a\nb' 

En Python 3:

>>> import codecs 
>>> codecs.decode('\\n\\x21', 'unicode_escape') 
'\n!' 
+3

Creo que el equivalente de esto para Python 3 es: 'bytes (s, 'utf-8'). Decode ("unicode_escape") ' –

+0

Alternativamente en Python 3:''a \\ nb'.encode(). decode ('unicode_escape') ' –

+0

@JonathanHartley debe enviar esto como una respuesta separada. –

7

No se encuentra, ese es el carácter de escape.

vistazo aquí: http://docs.python.org/reference/lexical_analysis.html en 2.4.1 "Secuencia de escape"

más importante \ n es un carácter de nueva línea. Y \\ es un carácter de escape escapado: D

>>> a = 'a\\\\nb' 
>>> a 
'a\\\\nb' 
>>> print a 
a\\nb 
>>> a.replace('\\\\', '\\') 
'a\\nb' 
>>> print a.replace('\\\\', '\\') 
a\nb 
0

Se debe a que, incluso en cadenas "en bruto" (= cadenas con un r antes de la cita de partida (s)), un carácter de escape sin escape puede no ser la última personaje en la cadena. Esto debería funcionar en su lugar:

'\\ '[0] 
+0

¿Por qué no ''\\''? Es valido – tzot

1

En literales de cadenas Python, la barra invertida es un carácter de escape. Esto también es cierto cuando el indicador interactivo muestra el valor de una cadena. Le dará la representación del código literal de la cadena. Use la instrucción print para ver cómo se ve realmente la cadena.

Este ejemplo muestra la diferencia:

>>> '\\' 
'\\' 
>>> print '\\' 
\ 
0
r'a\\nb'.replace('\\\\', '\\') 

o

'a\nb'.replace('\n', '\\n') 
1

su cadena original, a = 'a\\nb' no tiene realmente dos '\' caracteres, el primero es un escape para este último . Si lo haces, print a, verás que en realidad solo tienes un carácter '\'.

>>> a = 'a\\nb' 
>>> print a 
a\nb 

Sin embargo, si lo que quiere decir es interpretar la '\n' como un carácter de nueva línea, sin escapar de la barra, entonces:

>>> b = a.replace('\\n', '\n') 
>>> b 
'a\nb' 
>>> print b 
a 
b 
+0

¡Esto funcionó gracias! Parte del problema fue que me estaba confundiendo al pensar que \\ n tenía 3 caracteres en lugar de solo 2. – kand