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]
Respuesta
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__()
'\\'
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.
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.
¿Por qué esto no está marcado como solución? – erikbwork
>>> '\\&' == '\&'
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.
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.
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!). –
@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. –
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)
\&
- 1. regex: ¿cómo escapar barras diagonales inversas y caracteres especiales?
- 2. En PHP, ¿necesito escapar de las barras diagonales inversas?
- 3. ¿Cómo puedo escapar de las barras diagonales inversas en JSON?
- 4. Citando barras diagonales inversas en literales de cadena Python
- 5. Eliminar barras diagonales inversas de una cadena en Python
- 6. La conversión de barras diagonales inversas en barras diagonales mediante javascript no funciona correctamente?
- 7. ¿Cómo obtengo .NET's Path.Combine para convertir las barras diagonales en barras diagonales inversas?
- 8. Ignorar caracteres de escape (barras diagonales inversas) en cadenas R
- 9. Uso de barras diagonales inversas en abreviaturas vim
- 10. Eliminar todas las barras diagonales inversas de PHP urldecoded string
- 11. ¿Cómo puedo escapar de las barras diagonales inversas en un script sed incrustado en un script bash?
- 12. JavaScript y barras diagonales en cadenas
- 13. Eliminar barras diagonales
- 14. json_encode() escapa barras diagonales
- 15. ¿Por qué las barras diagonales inversas previenen la expansión de alias?
- 16. ¿Por qué CMake prefija espacios con barras diagonales inversas cuando se ejecuta un comando?
- 17. Necesito seleccionar solo datos que contengan barras diagonales inversas en MySQL
- 18. ¿Por qué sed requiere 3 barras diagonales inversas para una barra diagonal inversa regular?
- 19. Los patrones Java Regexp tienen barras diagonales inversas dobles, cómo almacenar patrones en formato legible
- 20. ¿Por qué desaparecen las barras diagonales inversas cuando se ejecutan a través del eco?
- 21. Escapar cadenas en JavaScript
- 22. nginx y barras diagonales en $ document_root?
- 23. Hacer diagonales inversas en blanco mapa de calor
- 24. ¿Regexp.escape no escapa a las barras diagonales?
- 25. Haciendo JSON no escapa barras diagonales
- 26. ¿Debo eliminar las barras diagonales en metaetiquetas?
- 27. ¿Todavía necesitamos barras diagonales en HTML5?
- 28. python replace barras invertidas a barras
- 29. ¿Cómo puedo escapar de una cadena Unicode con Ruby?
- 30. Ant produce jsfl con barras invertidas en lugar de barras
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
Si aún usa SO, marque una solución! – erikbwork
@Veedrac: ¿Cómo se marca esta pregunta de 4 años como un duplicado de una pregunta hecha hace 6 días? – User