python string replace double slash

Python Reemplace // con /



string replace (6)

Así que parece que no puedo resolver esto ... Tengo una cadena que dice "a//nb" y quiero que se convierta en "a/nb" . Intenté todo lo siguiente y ninguno parece funcionar;

>>> 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 el último, porque funciona bien:

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

¿Hay algo que me falta aquí?

EDITAR Entiendo que / es un personaje de escape. Lo que trato de hacer aquí es convertir todo //n //t etc. en /n /t etc. y reemplazar no parece estar funcionando 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.


En los literales de cadenas de 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 declaración de print para ver cómo se ve realmente la cadena.

Este ejemplo muestra la diferencia:

>>> ''//' ''//' >>> print ''//' /


Es porque, incluso en cadenas "en bruto" (= cadenas con una r antes de la (s) cita (s) inicial (es)), un carácter de escape sin escape no puede ser el último carácter de la cadena. Esto debería funcionar en su lugar:

''// ''[0]


No hay necesidad de usar reemplazar por esto.

Lo que tienes es una cadena codificada (usando la codificación string_escape ) y quieres decodificarla:

>>> 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!''


Su cadena original, a = ''a//nb'' 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.

>>> a = ''a//nb'' >>> print a a/nb

Sin embargo, si lo que quieres decir es interpretar ''/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


Te estás perdiendo, ese / es el personaje de escape.

Mire aquí: http://docs.python.org/reference/lexical_analysis.html en 2.4.1 "Escape Sequence"

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

>>> a = ''a////nb'' >>> a ''a////nb'' >>> print a a//nb >>> a.replace(''////', ''//') ''a//nb'' >>> print a.replace(''////', ''//') a/nb


r''a//nb''.replace(''////', ''//')

o

''a/nb''.replace(''/n'', ''//n'')