DeprecationWarning: Ungültige Escape-Sequenz - was anstelle von \ d verwenden?

106

Ich habe ein Problem mit dem reModul in Python 3.6.5 festgestellt. Ich habe dieses Muster in meinem regulären Ausdruck:

'\\nRevision: (\d+)\\n'

Aber wenn ich es laufen lasse, bekomme ich eine DeprecationWarning.

Ich habe auf SO nach dem Problem gesucht und die Antwort eigentlich nicht gefunden - was soll ich stattdessen verwenden \d+? Nur [0-9]+oder vielleicht noch etwas?

mchfrnc
quelle
2
Es sollte nicht das Problem sein, mehr Code bereitzustellen?
Sraw
3
Doppelte Flucht \doder Verwendung r'\\nRevision: (\d+)\\n'?
Revo

Antworten:

176

Python 3 interpretiert Zeichenfolgenliterale als Unicode-Zeichenfolgen. Daher wird Ihre Zeichenfolge als maskiertes \dUnicode-Zeichen behandelt.

Deklarieren Sie Ihr RegEx-Muster stattdessen als Rohzeichenfolge r, indem Sie wie folgt voranstellen :

r'\nRevision: (\d+)\n'

Dies bedeutet auch, dass Sie die \nEscapezeichen ebenfalls löschen können, da diese nur als Zeilenumbruchzeichen von analysiert werden re.

ACascarino
quelle
8
Genauer gesagt wird \des als nicht erkannte Escape-Sequenz behandelt und bleibt als solche unverändert. Eine DeprecationWarning wird seit Python 3.6 angegeben. In einigen zukünftigen Versionen von Python wird es ein SyntaxError sein. Details aus "2.4.1. String- und Byte-Literale" in den Dokumenten.
VPfB
@VPfB Der Thread ist alt, aber ich habe nach Antworten auf das gleiche Problem gesucht. Wenn \ d als maskiertes Unicode-Zeichen behandelt wird, wie kann ich d (alphabetisches Zeichen) von \ d (eine beliebige Ziffer) unterscheiden, ohne das Regex-Muster als Rohzeichenfolge zu behandeln? (Dieselbe Frage gilt für \ w, \ W etc ...)
giulia_dnt
2
@theggg Wenn ich Ihre Frage richtig verstehe - entkommen Sie Ihrem Backslash, damit die Zeichenfolge gelesen wird '\\d'.
ACascarino