¿Cómo eliminar el escape de una cadena con barra invertida? [duplicar]

Resuelto Nick asked hace 15 años • 6 respuestas

Supongamos que tengo una cadena que es una versión con barra invertida de otra cadena. ¿Existe una manera fácil, en Python, de eliminar el escape de la cadena? Podría, por ejemplo, hacer:

>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>> 

Sin embargo, eso implica pasar una cadena (posiblemente no confiable) a eval(), lo cual es un riesgo para la seguridad. ¿Existe una función en la biblioteca estándar que toma una cadena y produce una cadena sin implicaciones de seguridad?

Nick avatar Dec 11 '09 08:12 Nick
Aceptado
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
ChristopheD avatar Dec 11 '2009 01:12 ChristopheD

Puedes usar ast.literal_evalcuál es seguro:

Evalúe de forma segura un nodo de expresión o una cadena que contenga una expresión de Python. La cadena o nodo proporcionado solo puede constar de las siguientes estructuras literales de Python: cadenas, números, tuplas, listas, dicts, booleanos y Ninguno. (FIN)

Como esto:

>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!
jathanism avatar Dec 11 '2009 01:12 jathanism

Todas las respuestas dadas se dividirán en cadenas Unicode generales. Lo siguiente funciona para Python3 en todos los casos, hasta donde yo sé:

from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)

En versiones recientes de Python, esto también funciona sin importar:

sample = u'mon€y\\nröcks'
result = sample.encode('latin-1', 'backslashreplace').decode('unicode-escape')

Como lo sugiere obataku , también puedes usar el literal_evalmétodo del astmódulo así:

import ast
sample = u'mon€y\\nröcks'
print(ast.literal_eval(F'"{sample}"'))

O así cuando su cadena realmente contiene un literal de cadena (incluidas las comillas):

import ast
sample = u'"mon€y\\nröcks"'
print(ast.literal_eval(sample))

Sin embargo, si no está seguro de si la cadena de entrada utiliza comillas dobles o simples como delimitadores, o si no puede suponer que se escape correctamente, es posible que literal_evalel SyntaxErrormétodo de codificación/decodificación siga funcionando durante un tiempo.

Jesko Hüttenhain avatar Jul 24 '2019 23:07 Jesko Hüttenhain