Supposons que j'ai une chaîne qui est une version à barre oblique inversée d'une autre chaîne. Existe-t-il un moyen simple, en Python, de sortir la chaîne? 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 approuvée) à eval (), ce qui constitue un risque pour la sécurité. Existe-t-il une fonction dans la bibliothèque standard qui prend une chaîne et produit une chaîne sans implications pour la sécurité?
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
Vous pouvez utiliser ast.literal_eval
ce qui est sûr:
É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 composé que des structures littérales Python littérales: chaînes, nombres, tuples, listes, dict, booléens et Aucun. (FIN)
Comme ça:
>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!
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 = 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"
Toutes les réponses données se briseront sur les chaînes Unicode générales. Les informations suivantes fonctionnent pour Python3 dans tous les cas, pour autant que je sache:
from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)