Попробуйте использовать re.findall
со следующим шаблоном в режиме точка-все:
\bHeading 1:.*?(?=Heading \d+|$)
Режим точка-все гарантирует, что .*?
будет совпадать между строками. Ожидание в конце остановится либо до начала следующего заголовка, либо до конца ввода, в зависимости от того, что произойдет раньше.
Пример сценария:
inp = """garbage text
garbage text
Heading 1:
important content abx
important content xvy
important content
important content xyz
important content zed
Heading 2:
more content"""
matches = re.findall(r'\bHeading 1:.*?(?=Heading \d+|$)', inp, flags=re.DOTALL)
print(matches[0])
Это печатает:
Heading 1:
important content abx
important content xvy
important content
important content xyz
important content zed