<p>可以使用以下任一正则表达式来完成此操作</p>
<h2>选择1</h2>
<p>此选项使用<code>re.DOTALL</code></p>
<p><a href="https://regex101.com/r/XORRzN/1/" rel="nofollow noreferrer">See regex in use here</a></p>
<pre><code>(?:\A|\n{2})(?:(?!\n{2}).)+\.(?=\n{2}|\Z)
</code></pre>
<p>工作原理:</p>
<ul>
<li><code>(?:\A|\n{2})</code>匹配以下任一项:
<ul>
<li><code>\A</code>在<em>字符串</em>的开头断言位置(与<code>^</code>不同,后者在<em>行</em>的开头断言位置)</li>
<li><code>\n{2}</code>匹配两个连续的换行符</li>
</ul>
</li>
<li><code>(?:(?!\n{2}).)+</code><a href="https://stackoverflow.com/questions/30900794/tempered-greedy-token-what-is-different-about-placing-the-dot-before-the-negat">tempered greedy token</a>匹配任何字符,但未能匹配两个连续换行符</li>
<li><code>\.</code>逐字匹配<code>.</code></li>
<li><code>(?=\n{2}|\Z)</code>前瞻匹配以下任一项(断言匹配项后面的内容,但不在结果中包含匹配项):
<ul>
<li><code>\n{2}</code>匹配两个连续的换行符</li>
<li><code>\Z</code>与<code>\A</code>相反-断言<em>字符串</em>末尾的位置(不同于<code>$</code>-断言<em>行</em>末尾的位置)</li>
</ul>
</li>
</ul>
<h2>选择2</h2>
<p>此选项比选项1效率更高</strong>——使用的步骤减少约22%</p>
<p><a href="https://regex101.com/r/XORRzN/2" rel="nofollow noreferrer">See regex in use here</a></p>
<pre><code>(?:\A|\n{2})(?:.|\n(?!\n))+\.(?=\n{2}|\Z)
</code></pre>
<p>它的工作原理(大部分内容与前面相同,因此我只解释区别):</p>
<ul>
<li><code>(?:.|\n(?!\n))+</code>匹配任何字符(除了<code>\n</code>,因为<code>.</code>不匹配换行符),或者<code>\n</code>如果后面没有另一个<code>\n</code></li>
</ul>
<h2>选择3</h2>
<p>这只适用于PCRE或<a href="https://pypi.org/project/regex/" rel="nofollow noreferrer">PyPi regex package</a>。这比上述其他选项更有效-比选项2少21%的步骤,比选项1少39%。此正则表达式使用<code>re.DOTALL</code>选项</p>
<p><a href="https://regex101.com/r/XORRzN/4" rel="nofollow noreferrer">See regex in use here</a></p>
<pre><code>(?:\A|\n{2})(?:\n{2}(*SKIP)(*FAIL)|.)+?\.(?=\n{2}|\Z)
</code></pre>
<p>工作原理(同样,基本相同,只是解释了区别):</p>
<ul>
<li><code>(?:\n{2}(*SKIP)(*FAIL)|.)+?</code>匹配以下一个或多个次数,但尽可能少(<code>+?</code>-惰性量词)
<ul>
<li><code>\n{2}(*SKIP)(*FAIL)</code>匹配两个连续的换行符,然后使其失败(<code>(*SKIP)(*FAIL)</code>就像魔法一样,防止正则表达式回溯到其当前位置,然后使当前匹配失败。简单地说,这将跳过与<code>(*SKIP)</code>左侧匹配的所有字符(包括<code>\n\n</code>),然后在该位置之后继续模式匹配(有关详细信息,请参见<a href="https://stackoverflow.com/questions/24534782/how-do-skip-or-f-work-on-regex">this question</a>)</li>
</ul>
</li>
</ul>