Как исправить "<string> DeprecationWarning: неверная escape-последовательность" в Python? - PullRequest
0 голосов
/ 14 сентября 2018

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

0 голосов
/ 14 сентября 2018

\ - 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 соответствует началу строки. Но \A недопустимо в строковом литерале Python! Это неверно:

my_regex = "\Afoo"

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

my_regex = r"\Afoo"

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

...