Как я могу сопоставить блок кода reStructuredText с Regex и Python? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь извлечь code block из .rst документа, используя Python и regex . Блоки кода в документе определяются путем добавления директивы .. code-block:: python к тексту, а затем с отступом в несколько пробелов.

Вот пример из моего тестового документа:

.. code-block:: python

  import os
  from selenium import webdriver
  from axe_selenium_python import Axe

  def test_google():
      driver = webdriver.Firefox()
      driver.get("http://www.google.com")
      axe = Axe(driver)
      # Inject axe-core javascript into page.
      axe.inject()
      # Run axe accessibility checks.
      results = axe.execute()
      # Write results to file
      axe.write_results(results, 'a11y.json')
      driver.close()
      # Assert no violations are found
      assert len(results["violations"]) == 0,    axe.report(results["violations"])
      driver.close()

Пока у меня есть это регулярное выражение: (\.\. code-block:: python\s\s)(.*\s.+).*?\n\s+(.*\s.+)+

Проблема с этим шаблоном состоит в том, что он выбирает только первую часть и последнюю часть тестовой строки. Мне нужна помощь в написании шаблона, который может захватывать все в блоке кода .. code-block:: python, исключая директиву ..code-block:: python.

Вы можете увидеть прогресс, которого я достиг с этим здесь .

1 Ответ

0 голосов
/ 31 октября 2018

Если вы настаиваете на использовании регулярных выражений, следующее должно помочь, учитывая приведенный пример:

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 или отсутствие аргументов приведет к полной совпадению строки.

...