Если вы настаиваете на использовании регулярных выражений, следующее должно помочь, учитывая приведенный пример:
import re
pattern = r"(\.\. code-block:: python\s+$)((\n +.*|\s)+)"
matches = re.finditer(pattern, text, re.M)
for m, match in enumerate(matches):
for g, group_text in enumerate(match.groups()):
print("###match {}, group {}:###".format(m, g))
print(group_text, end="")
Я считаю, что хитрость заключается в использовании вложенных скобок и флага MULTILINE или M.
Полученные объекты match
будут иметь 3 групп , как определено в скобках:
- группа 1: заголовок '.. code-block:'
- группа 2: содержимое блока кода
- группа 3: пустая группа в результате дополнительной круглой скобки.
Чтобы получить группу n
, используйте match.group(n)
. Обратите внимание, что индексирование групп начинается с 1
и передача 0
или отсутствие аргументов приведет к полной совпадению строки.