Как исправить "DeprecationWarning: недопустимая escape-последовательность" в Python?

Я получаю много предупреждений, как это в 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 (

что они означают? И как я могу их исправить?

1 ответов


\ является escape-символом в строковых литералах Python.

например, если вы хотите поместить символ табуляции в строку, вы должны сделать:

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

если вы хотите поместить символ \ в строке, вы должны использовать \:

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

или используйте "сырую строку":

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

вы не можете просто поставить обратные косые черты в строковых литералах, когда захотите. Обратного слеша не действует, когда не следуют допустимые escape-последовательности и новые версии Python печатают предупреждение об устаревании. Например \A не является escape-последовательностью:

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

если ваша последовательность обратной косой черты случайно совпадает с одной из escape-последовательностей Python, но вы этого не хотели, это еще хуже.

поэтому вы всегда должны использовать необработанные строки или \.

важно помнить, что строковый литерал по-прежнему является строковым литералом, даже если эта строка предназначен для использования в качестве регулярного выражения. синтаксис регулярного выражения Python поддерживает множество специальных последовательностей, которые начинаются с \. Например \A соответствует началу строки. Но!--9--> недопустимо в строковом литерале Python! Это недопустимо:

my_regex = "\Afoo"

вместо этого, вы должны сделать это:

my_regex = r"\Afoo"

Docstrings еще один, чтобы помнить: docstrings также являются строковыми литералами и недопустимыми \ последовательности недопустимы в тоже комментарии! Используйте необработанные строки (r"""...""") для docstrings, если они содержат \s.