Під час роботи з текстовими файлами у Python часто виникає потреба обробляти багаторядкові рядки з використанням регулярних виразів. Особливо це актуально, коли необхідно захопити певні частини тексту між двома визначеними рядковими роздільниками. В даній статті ми розглянемо практичний приклад роботи з багаторядковими рядками в Python та використання модуля
1 |
re |
для цієї задачі.
Припустимо, у нас є текстовий файл, що містить інформацію про компіляцію програми. Нам потрібно захопити всі рядки, які знаходяться між рядками з ключовими словами “start_of_compile” і “end_of_compile”, виключаючи коментарі. Підходящий фрагмент файлу може виглядати наступним чином:
1 2 3 4 5 6 |
#####start_of_compile - DO NOT MODIFY THIS LINE############# ################################################################## parse these lines in between them ... .... ################################################################### #####end_of_compile -DO NOT MODIFY THIS LINE################# ################################################################### |
Для цієї задачі ми можемо скористатися модулем
1 |
re |
у Python. Найпоширеніший спосіб використання регулярних виразів для захоплення багаторядкових рядків – це використання символів
1 |
^ |
та
1 |
$ |
для початку і кінця рядка в поєднанні з флагом
1 |
re.MULTILINE |
, щоб зробити регулярний вираз багаторядковим.
Нижче наведено фрагмент коду, який реалізує пошук і захоплення багаторядкових рядків у Python з використанням модуля
1 |
re |
:
1 2 3 4 5 6 7 8 9 |
import re def capture_compile_section(): with open("compile.qel", "r") as compile_fh: lines = compile_fh.read() pattern = re.compile(r'^#+start_of_compile.*?\n(.*?)\n#+end_of_compile.*?$', re.MULTILINE | re.DOTALL) matches = pattern.findall(lines) for match in matches: print(match) capture_compile_section() |
У цьому коді ми використовуємо функцію
1 |
findall |
для знаходження всіх входжень паттерну у тексті. Паттерн
1 |
r'^#+start_of_compile.*?\n(.*?)\n#+end_of_compile.*?$' |
шукає текст, що знаходиться між рядками “start_of_compile” і “end_of_compile”, і захоплює його в групу за допомогою символу
1 |
(.*?) |
. Флаги
1 |
re.MULTILINE |
та
1 |
re.DOTALL |
дозволяють працювати з багаторядковим текстом, дозволяючи символу “.” співпадати з будь-яким символом, включаючи символи нового рядка.
Виконавши цей код, ми отримаємо список рядків, що містяться між роздільниками “start_of_compile” і “end_of_compile”, виключаючи коментарі. Цей підхід дозволяє ефективно та зручно обробляти багаторядкові рядки у Python з використанням регулярних виразів.