Ошибка задокументированных строк регулярки питон

"""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 шт):

Автор решения: Pak Uula

Грустно, что до жирафа доходит долго. Радует,что всё-таки доходит.

В конце концов я таки понял, о чём вопрос. Походу дела, ТС "закомментировал" кусок кода,заключив его в тройные кавычки. Что-то вроде такого

"""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-последовательность, и на неё сразу среагировал лексер.

Как этого избежать.

  1. Правильный способ - использовать комментарии, поставить # в начало ненужных строк. Все современные IDE умеют комментировать строки пачками.

  2. Способ для "комментирования" через строковые литералы: нужно поставить перед открывающими кавычками знак 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 без единого замечания.

→ Ссылка
Автор решения: Fox Fox

Рекомендую почитать какой-нибудь базовый учебник по Питону. Тройными кавычками не документируют свои какие-то заметки, а создают многострочную строковую переменную. Вы думали, что документируете, а на самом деле создаёте переменную noname. Следовательно, получаете сообщение о стандартной ошибке: \ должно быть в коде как \\ (кроме случая использования r). Посему, поставьте перед первыми """ r и попробуйте. Питон начнёт считать эту Вашу "документацию" неизменяемой многострочной строковой переменной и не будет выдавать сообщение об ошибке.

→ Ссылка