2009-12-11 8 views
65

Supongamos que tengo una cadena que es una versión de escape-barra invertida de otra cadena. ¿Hay alguna manera fácil, en Python, de deshacer el escape de la cadena? Podría, por ejemplo, hacer:¿Cómo puedo escapar de una cadena escapada de barra invertida en Python?

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

Sin embargo, que consiste en pasar una cadena (posiblemente no fiable) a eval() que es un riesgo para la seguridad. ¿Hay una función en la lib estándar que toma una cadena y produce una cadena sin implicaciones de seguridad?

Respuesta

111
>>> print '"Hello,\\nworld!"'.decode('string_escape') 
"Hello, 
world!" 
+5

+1 Oy Amo a todos los trucos que aprender de SO! – jathanism

+0

Buen truco pero no funcionó por completo para mí tristemente – sleepycal

+2

¿Hay algo que sea compatible con Python 3? – thejinx0r

18

Puede utilizar ast.literal_eval que es seguro:

Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None. (END)

De esta manera:

>>> import ast 
>>> escaped_str = '"Hello,\\nworld!"' 
>>> print ast.literal_eval(escaped_str) 
Hello, 
world! 
+0

el problema xy me vuelve a picar. ¡gracias por esto! – trianta2

+1

Tener un punto y coma escapado en la cadena rompe este código. Lanza un error de sintaxis "carácter inesperado después del carácter de continuación de línea" – darksky

+1

@darksky observa que la biblioteca 'ast' requiere comillas (ya sea' "' o ''', incluso '" "' 'o'' '' 'alrededor de su escaped_str, ya que en realidad está intentando ejecutarlo como código de Python pero mejora la seguridad (evita la inyección de cadenas) – no1xsyzy

Cuestiones relacionadas