Regex для поиска текста с известными символами в начале и в конце
Есть текстовый файл, в котором собрано много текста, вырезанного из разных книг. Каждый отрезок начинается со строки с заглавием вида "Название книги" и заканчивается строкой "===".
Какое регулярное выражение использовать, чтобы найти весь текст, который начинаются с "Название книги-1" и до строки "==="?
Выражение Название книги-1.*=== не подходит, т.к. поиск останавливается на символе перевода строки и не доходит до ===.
Ответы (1 шт):
Обычно библиотека, реализующая регулярные выражениям, включает возможность использовать флаги изменяющее их поведение. Флаг s делает так, что символу . сопоставляется в том числе и перенос строки (по умолчанию этого не происходит)
Пример на python
re.match(r'Название книги.*===', text, re.S)
или
re.match(r'(?s)Название книги.*===', text)
Пример на perl
/Название книги.*===/s;
или
/(?s)Название книги.*===/;
Также есть смысл использовать ленивый квантификатор *?, если в тексте встречается больше одной книги, иначе .* захватит все символы до самого последнего вхождения ===
>>> re.findall(r'<<<(.*)>>>', '<<<111\n222\n>>><<<333\n444\n>>>', re.S)
['111\n222\n>>><<<333\n444\n']
>>> re.findall(r'<<<(.*?)>>>', '<<<111\n222\n>>><<<333\n444\n>>>', re.S)
['111\n222\n', '333\n444\n']