Angenommen, ich habe eine Zeichenfolge, die eine Backslash-Escape-Version einer anderen Zeichenfolge ist. Gibt es in Python eine einfache Möglichkeit, die Zeichenfolge zu entfernen? Ich könnte zum Beispiel tun:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
Dies beinhaltet jedoch die Übergabe einer (möglicherweise nicht vertrauenswürdigen) Zeichenfolge an eval (), was ein Sicherheitsrisiko darstellt. Gibt es eine Funktion in der Standardbibliothek, die eine Zeichenfolge verwendet und eine Zeichenfolge ohne Auswirkungen auf die Sicherheit erzeugt?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
Beschädigt Nicht-ASCII-Zeichen in der Zeichenfolge . Dies ist keine gültige Lösung, es sei denn, die Eingabe enthält garantiert nur ASCII-Zeichen.Sie können verwenden,
ast.literal_eval
was sicher ist:So was:
quelle
ast
Bibliothek Anführungszeichen (entweder"
oder'
, sogar"""
oder'''
) um Ihren Escape_str erforderlich sind, da sie tatsächlich versucht, sie als Python-Code auszuführen, aber die Sicherheit erhöht (verhindert dasstr
eine istrepr
von einemstr
oderbytes
Objekt wie in dem OP des Fall; Dieunicode-escape
Codec-Antwort ist für den Fall, dass es sich nicht um einerepr
, sondern um eine andere Form von maskiertem Text handelt (nicht als Anführungszeichen als Teil der Zeichenfolgendaten selbst umgeben).Alle gegebenen Antworten werden bei allgemeinen Unicode-Zeichenfolgen unterbrochen. Folgendes funktioniert in allen Fällen für Python3, soweit ich das beurteilen kann:
Wie in den Kommentaren beschrieben, können Sie die
literal_eval
Methode aus demast
Modul auch folgendermaßen verwenden :Oder so, wenn Ihre Zeichenfolge wirklich ein Zeichenfolgenliteral enthält (einschließlich der Anführungszeichen):
Wenn Sie sich jedoch nicht sicher sind, ob die Eingabezeichenfolge doppelte oder einfache Anführungszeichen als Trennzeichen verwendet oder wenn Sie nicht davon ausgehen können, dass sie überhaupt ordnungsgemäß maskiert wird,
literal_eval
kann es sein, dassSyntaxError
die Codierungs- / Decodierungsmethode noch eine Weile funktioniert.quelle
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
funktioniert gut für mich mit Python 3.7.3In Python 3 haben
str
Objekte keinedecode
Methode und Sie müssen einbytes
Objekt verwenden. Die Antwort von ChristopheD bezieht sich auf Python 2.quelle
value.encode('utf-8').decode('unicode_escape')
.encode
?