У рядку «#1043 на 249.50 грн» шукаємо шаблон r"\d+". re.search знаходить '1043', а re.match повертає None. Чому?
Чому так. re.match прикріплений до початку тексту: шаблон має збігтися саме з позиції 0. На нульовій позиції стоїть «#», тому збігу немає. Спокуслива відповідь про «цілі слова» описує \b, а не match; кількість чисел у рядку на match не впливає взагалі. Для питання «чи є десь усередині» правильна функція — search.
Питання 2 / 8
Шаблон r"<.+>" на тексті «<b>замовлення</b> на <i>249.50</i>» дає один збіг завдовжки в увесь рядок. Що саме сталося?
Чому так. Жадібний квантифікатор бере якнайбільше й лише потім віддає символи назад, поки решта шаблону не складеться — тому «>» знайшлася остання, а не перша. Крапка тут ні до чого: без re.DOTALL вона переходу рядка не ловить, та й тексту в кілька рядків немає. Лікується або лінивим .+?, або запереченим класом [^>]+.
Питання 3 / 8
re.findall(r"\w+", "Олена kava") повертає ['Олена', 'kava']. Що станеться, якщо додати прапорець re.ASCII?
Чому так. За замовчуванням \w у Python охоплює весь Unicode, тому українські літери туди входять. re.ASCII звужує \d, \w, \s і \b до чистого ASCII — «Олена» випадає. Друга відповідь описує поведінку багатьох інших мов, і саме тому вона так переконливо звучить; у Python усе навпаки.
Питання 4 / 8
Яке із завдань не варто розвʼязувати регулярним виразом?
Чому так. «Починається з 2026» — це фіксований підрядок у фіксованому місці, тобто .startswith("2026"): швидше, читабельніше й без власного синтаксису. Решта три описують форму, а не конкретний підрядок — там перелічити варіанти неможливо, і регулярка виправдана.
Питання 5 / 8
Чому шаблон завжди пишуть сирим рядком r"..."?
Чому так. Зворотний скісний службовий у двох мовах одразу. Python бачить "\b" і робить із двох символів один — забій (код 8), а модулю re дістається вже зіпсований шаблон, який ніколи нічого не знайде. Префікс r вимикає цю обробку. TypeError не буде: звичайний рядок приймається, він просто означає інше.
Питання 6 / 8
Чому HTML принципово не розбирають регулярним виразом?
Чому так. Регулярний вираз описує регулярну мову — таку, для якої досить скінченної памʼяті. Знайти парний закривальний тег означає рахувати вкладеність, тобто памʼятати необмежене число; шаблон цього не вміє за визначенням. Довжина шаблону й екранування — незручності, а не причина: їх можна подолати, а обмеження на памʼять — ні.
Питання 7 / 8
Шаблон r"(a+)+b" застосували до рядка з 30 літер «a» без «b». Що станеться?
Чому так. Вкладені квантифікатори, які ловлять одне й те саме, змушують рушій перебрати всі способи розділити ланцюжок: 2^n варіантів. На 30 символах це близько мільярда кроків. Найпідступніше те, що помилки не буде — програма просто перестане відповідати. Попереднього аналізу «а чи є там b» рушій не робить.
Питання 8 / 8
У шаблоні є групи: re.findall(r"(\d+)\.(\d+)", "249.50 і 75.00"). Що поверне findall?
Чому так. Це щоразу дивує: коли в шаблоні є групи, findall повертає не збіги, а вміст груп — по кортежу на збіг. Щоб отримати цілі збіги, групу роблять незапамʼятовною, (?:...), або беруть finditer і читають .group(0). Обʼєкт Match findall не повертає ніколи — це робота search і finditer.