如何将reStructuredText代码块与Regex和Python匹配?

时间:2018-10-31 12:06:35

标签: python regex restructuredtext

我正在尝试使用 Python regex code block文档中提取.rst。通过在文本中添加.. 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指令以外的所有内容。

您可以看到我在此here上所取得的进步。

1 个答案:

答案 0 :(得分:0)

如果您坚持使用正则表达式,则应按照提供的示例执行以下操作:

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个groups,如括号所定义:

  • 第1组:“ ..代码块:”标题
  • 第2组:代码块的内容
  • 第3组:由于多余的分组括号,因此为空组。

要检索组n,请使用match.group(n)。请注意,组的索引始于1并传递0或没有参数将导致整个匹配的字符串。