❌ Ошибка 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("."))]