Ошибка задокументированных строк регулярки питон
"""from re import *
class DateError(Exception): ...
def correction(date):
pattern = compile(r'^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.(\d{4})$')
#print(pattern)
return match(pattern, date)
if correction(input("Ваша дата рождения: ")) is None:
raise DateError("Неверная дата")
else: print("Здорово!")
file = input("Введи название файла: ")
#DD/MM/YYYY, DD-MM-YYYY, DD.MM.YYYY, YYYY-MM-DD, YYYY/MM/DD
pattern = compile(r'(\d{4}[-/]\d{2}[-/]\d{2}|\d{2}[-/.]\d{2}[-/.]\d{4})')
with open(file, 'r', encoding='utf-8') as f:
text = f.read()
#print(text)
datbl = findall(pattern, text)
if datbl:
print("Найденные даты:")
for i in datbl:
print(i)
else:
print("Даты не найдены.")"""
Доброго времени суток, почему при работе программы задокументированные строки через """ вызывают ошибки? Где про это прочитать и как пофиксить?) Ошибка возникает следующая:
"""from re import *
SyntaxWarning: invalid escape sequence '\.'
>>>
Как не убирая кавычки, используя док-стринг. убрать ошибку?
Ответы (2 шт):
Грустно, что до жирафа доходит долго. Радует,что всё-таки доходит.
В конце концов я таки понял, о чём вопрос. Походу дела, ТС "закомментировал" кусок кода,заключив его в тройные кавычки. Что-то вроде такого
"""from re import *
class DateError(Exception): ...
def correction(date):
pattern = compile(r'^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.(\d{4})$')
#print(pattern)
return match(pattern, date)
if correction(input("Ваша дата рождения: ")) is None:
raise DateError("Неверная дата")
else: print("Здорово!")
file = input("Введи название файла: ")
#DD/MM/YYYY, DD-MM-YYYY, DD.MM.YYYY, YYYY-MM-DD, YYYY/MM/DD
pattern = compile(r'(\d{4}[-/]\d{2}[-/]\d{2}|\d{2}[-/.]\d{2}[-/.]\d{4})')
with open(file, 'r', encoding='utf-8') as f:
text = f.read()
#print(text)
datbl = findall(pattern, text)
if datbl:
print("Найденные даты:")
for i in datbl:
print(i)
else:
print("Даты не найдены.")"""
print("Hello world")
В python3.12 такой скрипт действительно вызывает предупреждение о неизвестной escape-последовательности.
Почему интерпретатор ругается.
Escape-последостельность - это пара символов \
и ещё какой-то символ. Например, \n
, или \a
. Когда Python разбирает строковые литералы, он обрабатывает такие поледовательности особым образом. Например, \n
заменяет на ASCII код LF
(linefeed, новая строка).
В спецификации языка перечислены все допустимые escape-последовательности.
Согласно этой ссылке, все нераспознанные escape-последовательности остаются в литералах без изменений, но начиная с версии 3.12 о них выдаются предупреждения.
До того, как вы "закомментировали" программу, пара \.
была в литерале "строки как-есть" (raw string) r'...'
. В таких литералах escape-последовательности игнорируются. Но после того, как вы обернули программу в """..."""
, получился простой строковый литерал, в котором пара \.
внезапно превратилась в escape-последовательность, и на неё сразу среагировал лексер.
Как этого избежать.
Правильный способ - использовать комментарии, поставить
#
в начало ненужных строк. Все современные IDE умеют комментировать строки пачками.Способ для "комментирования" через строковые литералы: нужно поставить перед открывающими кавычками знак
r
:r""" ... """
. Это превратит литерал в raw, и лексер проигнорирует\.
, содержащиеся в нём.
пруф:
r"""from re import *
class DateError(Exception): ...
def correction(date):
pattern = compile(r'^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.(\d{4})$')
#print(pattern)
return match(pattern, date)
if correction(input("Ваша дата рождения: ")) is None:
raise DateError("Неверная дата")
else: print("Здорово!")
"""
print("Hello world")
Этот скрипт выполняется python3.12 без единого замечания.
Рекомендую почитать какой-нибудь базовый учебник по Питону. Тройными кавычками не документируют свои какие-то заметки, а создают многострочную строковую переменную. Вы думали, что документируете, а на самом деле создаёте переменную noname. Следовательно, получаете сообщение о стандартной ошибке: \ должно быть в коде как \\ (кроме случая использования r). Посему, поставьте перед первыми """ r и попробуйте. Питон начнёт считать эту Вашу "документацию" неизменяемой многострочной строковой переменной и не будет выдавать сообщение об ошибке.