Как исправить "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.