it-swarm.com.de

Wie fixiere ich "<string> DeprecationWarning: ungültige Escape-Sequenz" in Python?

Ich bekomme viele Warnungen wie diese in Python:

DeprecationWarning: invalid escape sequence \A
  orcid_regex = '\A[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]\Z'

DeprecationWarning: invalid escape sequence \/
  AUTH_TOKEN_PATH_PATTERN = '^\/api\/groups'

DeprecationWarning: invalid escape sequence \
  """

DeprecationWarning: invalid escape sequence \.
  DOI_PATTERN = re.compile('(https?://(dx\.)?doi\.org/)?10\.[0-9]{4,}[.0-9]*/.*')

<unknown>:20: DeprecationWarning: invalid escape sequence \(

<unknown>:21: DeprecationWarning: invalid escape sequence \(

Was meinen sie? Und wie kann ich sie reparieren?

12
Sean Hammond

\ ist das Escape-Zeichen in Python-String-Literalen .

Wenn Sie beispielsweise ein Tabulatorzeichen in eine Zeichenfolge einfügen möchten, würden Sie Folgendes tun:

>>> print("foo \t bar")
foo      bar

Wenn Sie ein Literal \ in eine Zeichenfolge einfügen möchten, müssen Sie \\ verwenden:

>>> print("foo \\ bar")
foo \ bar

Oder benutze einen "rohen String":

>>> print(r"foo \ bar")
foo \ bar

Sie können nicht einfach Backslashes in String-Literalen setzen, wann immer Sie möchten. Ein Backslash ist nicht gültig, wenn keine der gültigen Escape-Sequenzen gefolgt wird, und neuere Versionen von Python geben eine Warnung für veraltete Informationen aus . Zum Beispiel ist \A keine Escape-Sequenz:

$ python3.6 -Wd -c '"\A"'
<string>:1: DeprecationWarning: invalid escape sequence \A

Wenn Ihre Backslash-Sequenz aus Versehen mit einer von Escape-Sequenzen von Python übereinstimmt, aber Sie haben es nicht so gemeint, ist das noch schlimmer.

Sie sollten also immer rohe Zeichenfolgen oder \\ verwenden.

Beachten Sie, dass ein Zeichenfolgenliteral immer noch ein Zeichenfolgenliteral ist, auch wenn diese Zeichenfolge als regulärer Ausdruck verwendet werden soll. Die Python-Syntax für reguläre Ausdrücke unterstützt viele spezielle Sequenzen, die mit \ beginnen. Zum Beispiel entspricht \A dem Anfang einer Zeichenfolge. Aber \A ist in einem Python-String-Literal nicht gültig! Das ist ungültig:

my_regex = "\Afoo"

Stattdessen sollten Sie Folgendes tun:

my_regex = r"\Afoo"

Zu beachten sind auch Docstrings: Docstrings sind ebenfalls String-Literale und ungültige \-Sequenzen sind auch in Docstrings ungültig! Verwenden Sie für Dokumentstrings rohe Zeichenfolgen (r"""..."""), wenn diese \s enthalten.

13
Sean Hammond

Als Zusammenfassung der Antwort von Sean Hammond (unter Berücksichtigung nur des, was ich in meinem Fall brauchte), um "PEP8: ungültige Escape-Sequenz" in einem regulären Ausdruck zu vermeiden, verwenden Sie 'r' char vor dem regulären Ausdruck: 

my_regex = r"\Afoo"
0
Loaderon