Suponha que eu tenha uma string que é uma versão com escape de barra invertida de outra string. Existe uma maneira fácil, em Python, de desfazer a fuga da string? Eu poderia, por exemplo, fazer:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
No entanto, isso envolve passar uma string (possivelmente não confiável) para eval (), o que é um risco de segurança. Existe uma função no lib padrão que pega uma string e produz uma string sem implicações de segurança?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
corrompe caracteres não ASCII na string . A menos que seja garantido que a entrada contenha apenas caracteres ASCII, esta não é uma solução válida.Você pode usar o
ast.literal_eval
que é seguro:Como isso:
fonte
ast
biblioteca requer aspas ("
ou'
, mesmo"""
ou'''
) em torno de seu escaped_str, uma vez que está realmente tentando executá-lo como código Python, mas aumenta a segurança (evita injeção de string)str
é arepr
de astr
ou umbytes
objeto como no caso do OP; aunicode-escape
resposta do codec é para quando não é umrepr
, mas alguma outra forma de texto de escape (não entre aspas como parte dos próprios dados da string).Todas as respostas fornecidas serão interrompidas em strings Unicode gerais. O seguinte funciona para Python3 em todos os casos, tanto quanto posso dizer:
Conforme descrito nos comentários, você também pode usar o
literal_eval
método doast
módulo assim:Ou assim, quando sua string realmente contém um literal de string (incluindo as aspas):
No entanto, se você não tiver certeza se a string de entrada usa aspas duplas ou simples como delimitadores, ou quando você não pode presumir que ela tenha um escape adequado,
literal_eval
pode demorar umSyntaxError
pouco para que o método de codificação / decodificação ainda funcione.fonte
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
funciona bem para mim com Python 3.7.3No python 3, os
str
objetos não têm umdecode
método e você deve usar umbytes
objeto. A resposta de ChristopheD cobre python 2.fonte
value.encode('utf-8').decode('unicode_escape')
,.encode
?