Вы можете использовать это регулярное выражение для извлечения различных частей:
(.*?)(?=\([^\)]*\)\d*(?:\n|$))\(([^)]*)\)(\d*)(?:\n|$)
У него есть 3 группы захвата:
- Весь текст до первого
(
, то есть сопровождаемый только одним )
, необязательными цифрами и концом строки или строки (так будет работать с заголовками, которые содержат (
; - Текст между
(
и )
; - Любые цифры после
)
и до новой строки или конца строки.
Пример использования:
import re
txt = '''Lorem ipsum dolor sit amet, consectetur
adipiscing elit.
(January 1, 2008)
The 39
steps
(June 30, 2007)361
A title with
a (bracketed) word
(April 1, 2020)34
Finibus Bonorum et Malorum
(July 3, 2008)398'''
pattern = re.compile(r'(.*?)(?=\([^\)]*\)\d*(?:\n|$))\(([^)]*)\)(\d*)(?:\n|$)', re.S)
print(pattern.findall(txt))
Вывод:
[
('Lorem ipsum dolor sit amet, consectetur \nadipiscing elit.\n', 'January 1, 2008', ''),
('The 39\nsteps\n', 'June 30, 2007', '361'),
('A title with\na (bracketed) word\n', 'April 1, 2020', '34'),
('Finibus Bonorum et Malorum\n', 'July 3, 2008', '398')
]