2010-02-01 19 views
17

Necesito escapar un carácter & (ampersand) en una cadena. El problema es siempre que I string = string.replace ('&', '\&') el resultado es '\\&'. Se agrega una barra invertida adicional para escapar de la barra invertida original. ¿Cómo elimino esta barra invertida adicional?Agregar barras diagonales inversas sin escapar [Python]

+0

Sabiendo nada de nada sobre Python: Cadena = string.replace ('&', '&') ... tal vez el método de reemplazo escapará de ese y comercial para usted ... heh – iandisme

+6

Si aún usa SO, marque una solución! – erikbwork

+0

@Veedrac: ¿Cómo se marca esta pregunta de 4 años como un duplicado de una pregunta hecha hace 6 días? – User

Respuesta

17

La barra invertida adicional en realidad no se agrega; se acaba de agregar mediante la función repr() para indicar que se trata de una barra invertida literal. El intérprete de Python usa la función repr() (que llama a __repr__() en el objeto) cuando el resultado de una expresión debe ser impresa:

>>> '\\' 
'\\' 
>>> print '\\' 
\ 
>>> print '\\'.__repr__() 
'\\' 
3

No hay barra inversa extra, es sólo el formato de esa manera en el entorno interactivo. Pruebe:

print string 

Luego puede ver que realmente no hay una barra invertida adicional.

55

El resultado '\\&' sólo se muestra - en realidad la cadena es \&:

>>> str = '&' 
>>> new_str = str.replace('&', '\&') 
>>> new_str 
'\\&' 
>>> print new_str 
\& 

probarlo en una concha.

+7

¿Por qué esto no está marcado como solución? – erikbwork

5
>>> '\\&' == '\&' 
True 
>>> len('\\&') 
2 
>>> print('\\&') 
\& 

O en otras palabras: '\\&' solo contiene una barra invertida. Simplemente se escapó en la salida del shell de Python para mayor claridad.

12

Python trata \ en cadena literal de una manera especial.
Esto es para que pueda escribir '\n' en el sentido de nueva línea o '\t' en el sentido de pestaña
Desde '\&' no significa nada especial para Python, en lugar de causar un error, el analizador léxico Python añade implícitamente la \ extra para tú.

en realidad es mejor usar \\& o r'\&' en lugar de '\&'

El r aquí significa cadena de texto en y significa que no se trata \ especialmente a menos que sea justo antes del carácter de comillas en el inicio de la cuerda.

En la consola interactiva, Python usa repr para mostrar el resultado, por eso aparece el doble '\'. Si print la cadena o utilizar len(string) verá que en realidad es sólo los 2 caracteres

Algunos ejemplos

>>> 'Here\'s a backslash: \\' 
"Here's a backslash: \\" 
>>> print 'Here\'s a backslash: \\' 
Here's a backslash: \ 
>>> 'Here\'s a backslash: \\. Here\'s a double quote: ".' 
'Here\'s a backslash: \\. Here\'s a double quote: ".' 
>>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".' 
Here's a backslash: \. Here's a double quote ". 

para aclarar el punto de Pedro hace en su comentario ver this link

diferencia Estándar C, todas las secuencias de escape no reconocidas permanecen en la cadena sin cambios, es decir, la barra diagonal inversa se deja en la cadena.(Este comportamiento es útil cuando la depuración: si está escrito mal una secuencia de escape , la salida resultante es más fácilmente reconocido como roto.) También es importante tener en cuenta que las secuencias de escape marcados como “(Unicode solamente)” en la tabla anterior entran en la categoría de no reconocidos escapes para literales que no sean Unicode literales.

+0

Parte de esto no es correcto. Python does * not * "agrega implícitamente el' 'extra para ti". Sin embargo, dobla la barra diagonal inversa cuando se muestra la salida repr() de la cadena, como en el momento, solo para propósitos de presentación. len ("\ &") es solo 2, lo que demuestra que no existe una pérdida implícita de sus datos (¡gracias a Dios!). –

+0

@PeterHansen Creo que el OP estaba señalando que las barras negras normalmente deberían escaparse en cadenas no crudas, por lo que normalmente se escribiría duplicado. –

1

la impresión de una lista también puede causar este problema (soy nuevo en Python, por lo que me confundió un poco demasiado):

>>>myList = ['\\'] 
>>>print myList 
['\\'] 
>>>print ''.join(myList) 
\ 

parecida:

>>>myList = ['\&'] 
>>>print myList 
['\\&'] 
>>>print ''.join(myList) 
\& 
Cuestiones relacionadas