web-dev-qa-db-fra.com

Comment annuler l'échappement d'une chaîne échappée par une barre oblique inverse?

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é?

85
Nick
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
128
ChristopheD

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!
31
jathanism

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"
15
antoine-sac

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)
1
Jesko Hüttenhain