132 votes

Comment échapper à une chaîne échappée par antislash ?

Supposons que j'ai une chaîne qui est une version échappée par antislash d'une autre chaîne. Existe-t-il un moyen facile, en Python, d'échapper à la corde ? Je pourrais, par exemple, faire :

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

Cependant, cela implique de passer une chaîne (éventuellement non sécurisée) à eval(), ce qui constitue un risque pour la sécurité. Existe-t-il une fonction dans la lib standard qui prend une chaîne et produit une chaîne sans implications de sécurité ?

154voto

ChristopheD Points 38217
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"

50voto

jathanism Points 15208

Vous pouvez utiliser ast.literal_eval en toute sécurité :

Évaluez en toute sécurité un nœud d'expression ou une chaîne contenant une expression Python. La chaîne ou le nœud fourni ne peut être constitué que des structures littérales Python suivantes : chaînes, nombres, tuples, listes, dicts, booléens, et Aucun. (FIN)

Comme ceci :

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

19voto

antoine-sac Points 2477

Dans python 3, les objets str n'ont pas de méthode decode et vous devez utiliser un objet bytes. La réponse de ChristopheD couvre le python 2.

# create a `bytes` object from a `str`
my_str = "Hello,\\nworld"
# (pick an encoding suitable for your str, e.g. 'latin1')
my_bytes = my_str.encode("utf-8")

# or directly
my_bytes = b"Hello,\\nworld"

print(my_bytes.decode("unicode_escape"))
# "Hello,
# world"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X