Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Позитивний та негативний перегляд, жадібне та не жадібне співставлення | Розширені регулярні вирази та їх застосування
Регулярні Вирази Python

Позитивний та негативний перегляд, жадібне та не жадібне співставлення

Свайпніть щоб показати меню

Розуміння розширених можливостей регулярних виразів, таких як lookahead (передбачення), lookbehind (зворотне передбачення) та нежадібні квантифікатори, дозволяє виконувати надзвичайно точне зіставлення шаблонів у Python. Lookahead і lookbehind — це різновиди нульової ширини тверджень (zero-width assertions), які дають змогу перевірити, чи існує (або не існує) певний шаблон перед або після поточної позиції в тексті, не включаючи цей шаблон у сам збіг. Нежадібні квантифікатори дозволяють контролювати, скільки тексту поглинає шаблон, забезпечуючи збіг лише з необхідною кількістю символів.

  • Lookahead записується як (?=...) і перевіряє, чи певний шаблон слідує за поточною позицією;
  • Lookbehind, записується як (?<=...), перевіряє, чи певний шаблон передує поточній позиції;
  • Нежадібні квантифікатори, такі як *? і +?, змінюють стандартну жадібну поведінку квантифікаторів;
  • За замовчуванням квантифікатори, як-от * і +, захоплюють якомога більше тексту; додавання ? робить їх нежадібними, тому вони захоплюють мінімально можливу кількість тексту.

Приклад lookahead: \w+(?=\d) знаходить слово лише тоді, коли за ним одразу йде цифра, але цифра не входить у збіг. Lookbehind працює подібно, але в протилежному напрямку.

1234567891011121314
import re # Lookahead: Match words followed by a digit text = "apple1 banana2 cherry pie" pattern_lookahead = r"\w+(?=\d)" matches_lookahead = re.findall(pattern_lookahead, text) print("Lookahead matches:", matches_lookahead) # Non-greedy matching: Extract text between tags html = "<b>Bold</b> and <b>Strong</b>" pattern_nongreedy = r"<b>(.*?)</b>" matches_nongreedy = re.findall(pattern_nongreedy, html) print("Non-greedy matches:", matches_nongreedy)

Як lookahead і нежадібні квантифікатори впливають на зіставлення шаблонів

Шаблон lookahead \w+(?=\d) у прикладі знаходить будь-яку послідовність символьних знаків (\w+) лише тоді, коли за нею безпосередньо йде цифра (\d). Результат збігу не включає цифру, оскільки lookahead не поглинає символи, які він перевіряє. Це корисно, коли потрібно знайти слова, що відповідають певній умові щодо наступного елемента, не включаючи цей елемент у збіг.

Нежадібний квантифікатор *? у <b>(.*?)</b> змінює обсяг тексту, який захоплюється між тегами <b> і </b>. Жадібний квантифікатор, такий як .*, захопив би якомога більше, потенційно все від першого <b> до останнього </b>. Використовуючи *?, шаблон захоплює мінімально можливу кількість тексту, тобто лише вміст кожної пари тегів окремо. Це запобігає надмірному захопленню та гарантує отримання найменшого можливого підрядка, що відповідає умовам.

Lookahead і нежадібні квантифікатори надають потужний контроль над тим, як регулярні вирази вибирають текст:

  • Lookahead дозволяє перевірити, що збіг супроводжується певним шаблоном, не включаючи його;
  • Нежадібні квантифікатори допомагають уникнути захоплення зайвого тексту.
question mark

Що робить негрідний квантіфікатор *??

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 1

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 1
some-alt