¿Cómo eliminar el escape de una cadena con barra invertida? [duplicar]
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?
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
Puedes usar ast.literal_eval
cuá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!
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_eval
método del ast
mó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_eval
el SyntaxError
método de codificación/decodificación siga funcionando durante un tiempo.