Домашнє завдання

Регулярні вирази

Тест: quiz.html

Працюємо з тим самим журналом, що й у лекції. Він навмисно «брудний»: рядки різного формату, зайві пробіли, різний регістр рівнів. Скопіюй його до себе:

ЖУРНАЛ = """2026-03-15 09:41 INFO  #1043 Олена kava@lviv.ua +380671234567 249.50 грн
2026-03-15 09:42 warn  #1044 Петро petro@ua.net +380509876543 1290.00 грн
2026-03-16 11:03 ERROR #1045 Ірина iryna@mail.com +38 (063) 111-22-33 75.00 грн
2026-03-16 11:07 INFO  #1046 Богдан-Тарас bt.koval+shop@ua-mail.net 0951234567 3.99 грн
непридатний рядок без жодних даних
2026-03-17 08:15 error #1047 Ґалина galyna@ukr.net +380671110099 15200.00 грн"""

рівень 1Рівень 1 — База

Витягни з журналу три списки: усі номери замовлень, усі адреси пошти, усі суми. Кожен шаблон пиши сирим рядком і поясни коментарем українською, що означає кожна його частина.

Окремо зроби четверте завдання без регулярки — порахуй, скільки рядків починаються з 2026-03-16. Використай .startswith() і поясни в коментарі, чому тут шаблон був би зайвий.

Зроблено, якщо:


рівень 2Рівень 2 — Плюс

Напиши функцію розібрати_рядок(рядок), яка повертає словник із полями дата, час, рівень, номер, клієнт, пошта, телефон, сума — або None, якщо рядок не підходить під формат.

Вимоги до шаблону:

  1. усі групи іменовані, шаблон записаний із re.VERBOSE і коментарями;
  2. рівень розпізнається незалежно від регістру (INFO, info, Info), але в результаті завжди зберігається великими літерами;
  3. імʼя клієнта може містити дефіс (Богдан-Тарас) і українські літери, зокрема ґ і Ґ;
  4. телефон приймається в усіх трьох формах, що є в журналі — +380671234567, +38 (063) 111-22-33 і 0951234567 — і в результаті завжди зберігається як +380XXXXXXXXX;
  5. сума в словнику має бути числом float, а не рядком.

Далі побудуй словник сума_за_рівнем і виведи його впорядкованим за спаданням суми.

Зроблено, якщо:


рівень 3Рівень 3 — Виклик

Дослідження на дві частини.

Частина А · шаблон проти методів. Візьми задачу «розбити рядок журналу на поля». Реалізуй її двома способами: через свій шаблон із рівня 2 і через звичайні .split(), .strip(), зрізи. Виміряй обидва на журналі, повтореному 20 000 разів (ЖУРНАЛ * 20000), і зроби чесний висновок: де швидше, де читабельніше і за яких умов ти обрав би кожен варіант. Окремо виміряй скомпільований шаблон (re.compile) проти re.search у циклі.

Частина Б · катастрофічний відкат. Для n від 12 до 23 виміряй час re.search(r"(a+)+b", "a" * n). Побудуй таблицю «n → час → відношення до попереднього». Потім:

Зроблено, якщо:


Підказки