2009-12-11 4 views
65

Supposons que j'ai une chaîne qui est une version d'une autre chaîne échappée par une barre oblique inverse. Y a-t-il un moyen facile, en Python, d'enlever la chaîne? Je pourrais, par exemple, faire:Comment est-ce que j'échappe à une chaîne échappée de barre oblique inverse en python?

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

Cependant qui consiste à faire passer une chaîne (éventuellement non sécurisé) à eval() qui est un risque de sécurité. Y at-il une fonction dans la bibliothèque standard qui prend une chaîne et produit une chaîne sans implications de sécurité?

Répondre

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

+1 Oy J'aime tous les trucs cool que j'apprends de SO! – jathanism

+0

Bon tour, mais n'a pas fonctionné complètement pour moi malheureusement – sleepycal

+2

Y at-il quelque chose qui est compatible avec Python 3? – thejinx0r

18

Vous pouvez utiliser ast.literal_eval qui est sûr:

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)

Comme ceci:

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

le problème xy me mord à nouveau. Merci pour cela! – trianta2

+1

Avoir un point-virgule échappé dans la chaîne casse ce code. Lance une erreur de syntaxe "caractère inattendu après le caractère de continuation de ligne" – darksky

+1

@darksky remarque que la bibliothèque 'ast' nécessite des guillemets (soit' "' ou ''', même '" "" 'ou'' '' '') autour de votre escaped_str, car il essaie actuellement de l'exécuter en tant que code Python mais améliore la sécurité (empêche l'injection de chaîne) – no1xsyzy

Questions connexes