📖 Теория: повторяем регулярки, файлы, JSON и даты

⚡ Кратко

Урок — это практика. Основные инструменты: модуль re для поиска по шаблону, json для сериализации, datetime для дат, файловые операции и генераторы для экономии памяти.

  • Regex: используйте r"...", re.findall, re.sub, \b для границ слов.
  • JSON: json.load читает объект, json.dump записывает с отступами.
  • Даты: datetime.strptime(date_str, "%d-%m-%Y") превращает строку в объект date.
  • Генераторы: функции с yield или выражения (x for x in ...) не загружают всё в память.

Цель практикума

Практикум 15 объединяет несколько тем, которые уже проходили отдельно: обработку текста регулярными выражениями, чтение и запись файлов, парсинг JSON и дат. Решение каждой задачи строится из маленьких шагов: открыть источник, извлечь нужные данные, преобразовать их и сохранить результат.

Регулярные выражения в задачах

Во всех текстовых задачах используется модуль re. Главные приёмы:

  • re.findall(pattern, text) — возвращает список всех совпадений.
  • re.sub(r"\D", "", text) — удаляет из строки всё, кроме цифр.
  • \b — граница слова, помогает отсечь лишние символы.
  • (?:...) — негруппирующая группа, не создаёт отдельных элементов в результате.
import re

# Найдём все слова из букв и цифр
text = "Order #123, code: ABC-42"
print(re.findall(r"\b\w+\b", text))

Работа с JSON

JSON — универсальный формат обмена данными. В Python за него отвечает модуль json:

  • json.load(file) — читает JSON из открытого файла и возвращает объект Python.
  • json.dump(obj, file, indent=4) — записывает объект в файл с отступами.
  • json.loads(string) / json.dumps(obj) — те же операции со строкой.
import json
from pathlib import Path

grades = [
    {"name": "Alice", "subject": "Math", "grade": 90, "date": "12-03-2025"},
]

Path("grades.json").write_text(
    json.dumps(grades, indent=2, ensure_ascii=False),
    encoding="utf-8",
)

Парсинг дат

Даты в задачах приходят в виде строки "06-09-2025" (день-месяц-год). Чтобы получить месяц, используем datetime.strptime:

from datetime import datetime

date_obj = datetime.strptime("06-09-2025", "%d-%m-%Y")
print(date_obj.month)  # 9
print(date_obj.year)   # 2025

Генераторы

Генераторы позволяют обрабатывать большие файлы по частям. Вместо того чтобы читать весь файл в память, можно читать строку за строкой:

from pathlib import Path

def read_lines(path: Path):
    with path.open(encoding="utf-8") as file:
        for line in file:
            yield line.rstrip("\n")

for line in read_lines(Path("big_file.txt")):
    print(line)

Современный доступ к файлам

Вместо строковых путей и функций os.path современный Python рекомендует pathlib.Path:

from pathlib import Path

report_path = Path("data") / "quarterly_report.json"
text = report_path.read_text(encoding="utf-8")
Проверить по документации: подробности о pathlib, datetime, json и re — в официальной документации Python: pathlib, datetime, json, re.