Supongamos que tengo una cadena que es una versión de escape con barra invertida de otra cadena. ¿Existe una manera fácil, en Python, de eliminar 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 () que es un riesgo de seguridad. ¿Existe una función en la biblioteca estándar que toma una cadena y produce una cadena sin implicaciones de seguridad?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
corrompe los caracteres no ASCII en la cadena . A menos que se garantice que la entrada solo contiene caracteres ASCII, esta no es una solución válida.Puede usar
ast.literal_eval
cuál es seguro:Me gusta esto:
fuente
ast
biblioteca requiere comillas ("
o'
, incluso"""
o'''
) alrededor de su escaped_str, ya que en realidad está tratando de ejecutarlo como código Python pero mejora la seguridad (evita la inyección de cadenas)str
es unrepr
de un objetostr
obytes
como en el caso del OP; launicode-escape
respuesta del códec es para cuando no es unrepr
, sino alguna otra forma de texto de escape (no entre comillas como parte de los datos de la cadena).[ERROR] TypeError: string indices must be integers
y esta solución funcionó para resolverlo. Elimine el escape de la cadena y luego analícela como JSON.Todas las respuestas dadas se romperán en cadenas Unicode generales. Lo siguiente funciona para Python3 en todos los casos, por lo que puedo decir:
Como se describe en los comentarios, también puede usar el
literal_eval
método delast
módulo así:O así cuando su cadena realmente contiene un literal de cadena (incluidas las comillas):
Sin embargo, si no está seguro de si la cadena de entrada utiliza comillas dobles o simples como delimitadores, o si no puede asumir que se ha escapado correctamente, es
literal_eval
posibleSyntaxError
que el método de codificación / decodificación siga funcionando durante un tiempo.fuente
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
funciona bien para mí con Python 3.7.3En Python 3, los
str
objetos no tienen undecode
método y debes usar unbytes
objeto. La respuesta de ChristopheD cubre Python 2.fuente
value.encode('utf-8').decode('unicode_escape')
.encode
?