擅长:python、mysql、java
<p>我建议您尝试<a href="https://regex101.com/" rel="nofollow noreferrer">regex101.com</a>,它将帮助您可视化您的正则表达式。另外,<a href="https://docs.python.org/3/library/re.html" rel="nofollow noreferrer">documentation for re</a>对于学习(或记住)特殊字符是如何工作的非常有用。在</p>
<p>在您的示例中,我将使用以下regex(带命名组):</p>
<pre><code>(?P<section_number>\d\.\d) (?P<section_title>[\w ]+)\n\n\s*(?P<body>.+?)\s*(?=\d\.\d[\w ]+|$)
</code></pre>
<p>分解:</p>
<p>对于节号和标题,我使用了以空格分隔的命名组<code>(?P<section_number>\d\.\d)</code>和{<cd2>}。在</p>
<p>主体<code>(?P<body>.+?)</code>后面是正展望<code>(?=\d\.\d[\w ]+|$)</code>。这意味着当另一节即将开始或文档结束时,它将停止捕获文本。它必须是nongreedy(<code>+?</code>),否则您只需要打开一个部分,将文档的其余部分作为主体。在</p>
<p>注意:在编译或搜索匹配项时,需要启用<code>re.DOTALL</code>,否则该点将与新行字符不匹配。在</p>
<p>如果希望节标题与字符串的begging匹配,也可以在lookahead中添加一个<code>^</code>,但是需要启用<code>re.MULTILINE</code>。您还必须将末尾的<code>$</code>改为<code>\Z</code>,这样它只匹配文档的结尾,而不是每行的结尾。在</p>
^{pr2}$