Supposons que j'ai une chaîne qui est une version échappée par une barre oblique inverse d'une autre chaîne. Existe-t-il un moyen simple, en Python, de faire disparaître 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 (peut-être non approuvée) à eval (), ce qui représente un risque pour la sécurité. Y a-t-il une fonction dans la bibliothèque standard qui prend une chaîne et produit une chaîne sans implication de sécurité?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
corrompt les caractères non ASCII de la chaîne . À moins que l'entrée ne contienne uniquement des caractères ASCII, ce n'est pas une solution valide.Vous pouvez utiliser
ast.literal_eval
ce qui est sûr:Comme ça:
la source
ast
bibliothèque nécessite des guillemets (soit"
ou'
, même"""
ou'''
) autour de votre escaped_str, car elle essaie en fait de l'exécuter en tant que code Python mais améliore la sécurité (empêche l'injection de chaîne)str
est unrepr
d'un objetstr
oubytes
comme dans le cas de l'OP; launicode-escape
réponse du codec est pour quand ce n'est pas unrepr
, mais une autre forme de texte échappé (non entouré de guillemets dans le cadre des données de chaîne elles-mêmes).[ERROR] TypeError: string indices must be integers
et cette solution a fonctionné pour résoudre ce problème. Annulez l'échappement de la chaîne, puis analysez-la comme JSON.Toutes les réponses données seront interrompues sur les chaînes Unicode générales. Ce qui suit fonctionne pour Python3 dans tous les cas, pour autant que je sache:
Comme indiqué dans les commentaires, vous pouvez également utiliser la
literal_eval
méthode duast
module comme suit:Ou comme ceci lorsque votre chaîne contient vraiment une chaîne littérale (y compris les guillemets):
Cependant, si vous ne savez pas si la chaîne d'entrée utilise des guillemets doubles ou simples comme délimiteurs, ou si vous ne pouvez pas du tout supposer qu'elle est correctement échappée, la méthode d'encodage / décodage fonctionnera peut-être encore
literal_eval
unSyntaxError
certain temps.la source
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
fonctionne bien pour moi avec Python 3.7.3En python 3, les
str
objets n'ont pas dedecode
méthode et vous devez utiliser unbytes
objet. La réponse de ChristopheD couvre python 2.la source
value.encode('utf-8').decode('unicode_escape')
.encode
?