🐛 Типичные ошибки

⚡ Топ-3 ошибки

  1. Неправильная привязка месяцев к кварталам в задаче 1.
  2. Забытые сырые строки в regex.
  3. Слишком «мягкий» шаблон для email.

❌ Ошибка 1. Неправильная привязка месяцев к кварталам

# Неправильно: метки кварталов не соответствуют условию задачи
def get_quarter(date_str):
    month = datetime.strptime(date_str, "%d-%m-%Y").month
    if 1 <= month <= 3:
        return "Q2"
    elif 4 <= month <= 5:
        return "Q3"
    elif 9 <= month <= 12:
        return "Q1"

Почему возникает: в исходном решении январь–март помечены как Q2, апрель–май как Q3, сентябрь–декабрь как Q1. Это не соответствует условию задачи, где Q1 — январь–март, Q2 — апрель–май, Q3 — сентябрь–декабрь.

✅ Исправление

def get_quarter(date_str: str) -> str | None:
    month = datetime.strptime(date_str, "%d-%m-%Y").month
    if 1 <= month <= 3:
        return "Q1"
    if 4 <= month <= 5:
        return "Q2"
    if 9 <= month <= 12:
        return "Q3"
    return None

❌ Ошибка 2. Забытые сырые строки в regex

# Неправильно
re.findall("\d+", "Price: 123")

Сообщение об ошибке: шаблон может не найти цифры, потому что \d превращается в escape-последовательность строки, а не regex.

✅ Исправление

# Правильно
re.findall(r"\d+", "Price: 123")

❌ Ошибка 3. Regex слишком «мягкий» для email

# Неправильно: допускает точку в начале/конце локальной части
pattern = r"\b[a-zA-Z0-9._]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}\b"

Почему возникает: класс [a-zA-Z0-9._]+ разрешает точку где угодно, поэтому совпадут .user@example.com и user.@example.com, что противоречит условию.

✅ Исправление

local = r"[a-zA-Z0-9_](?:[a-zA-Z0-9._]*[a-zA-Z0-9_])?"
pattern = rf"\b{local}@[a-zA-Z0-9.-]+\.[a-zA-Z]{{2,3}}\b"

❌ Ошибка 4. Открытие файла без указания кодировки

# Неправильно
with open("grades.json", "r") as file:
    data = json.load(file)

Сообщение об ошибке: на Windows может возникнуть UnicodeDecodeError, если файл в UTF-8, а системная кодировка CP1251/CP1252.

✅ Исправление

with open("grades.json", "r", encoding="utf-8") as file:
    data = json.load(file)

Или ещё лучше — через pathlib.Path.

❌ Ошибка 5. Полагаться только на regex для сложной валидации

# Неправильно: regex не проверяет, что числа IP не превышают 255
re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", text)

Почему возникает: регулярное выражение проверяет форму, но не семантику. Например, 999.999.999.999 тоже подойдёт.

✅ Исправление

candidates = re.findall(pattern, text)
valid = [ip for ip in candidates
         if all(0 <= int(part) <= 255 for part in ip.split("."))]