<p>下面是一个具有最小更改的正则表达式:</p>
<pre class="lang-py prettyprint-override"><code>^\s*(\w+)(?:\s*[^\w\s].*$\n)*^\s*(\w+)[^()]*\(
</code></pre>
<p>见<a href="https://regex101.com/r/sAbuRN/1/" rel="nofollow noreferrer">regex demo</a></p>
<p><code>\s*$\n(?:^\s*[^\w\s]</code>部分替换为<code>(?:\s*[^\w\s]</code>,因为第一个块不包含换行符</p>
<p>最后,<code>\s*\(</code>被替换为<code>[^()]*\(</code>,因为要提取的单词和<code>(</code>字符之间除了空格之外还有其他字符</p>
<p><em>详细信息</em>:</p>
<ul>
<li><code>^</code>-行的开头(允许您使用<code>re.M</code>)</li>
<li><code>\s*</code>-零个或多个空格</li>
<li><code>(\w+)</code>-组1:一个或多个单词字符</li>
<li><code>(?:\s*[^\w\s].*\n)*</code>-零个或多个空格、除<code>_</code>之外的特殊字符、行的其余部分和LF字符的出现次数为零或多</li>
<li><code>^</code>-行的开始</li>
<li><code>\s*</code>-零个或多个空格</li>
<li><code>(\w+)</code>-第2组:一个或多个单词字符</li>
<li><code>[^()]*</code>-除<code>(</code>和<code>)</code>之外的零个或多个字符</li>
<li><code>\(</code>-a<code>(</code>字符</李>
</ul>
<p>或者,我认为您可以利用PyPi正则表达式中的递归特性。在终端/控制台中运行<code>pip install regex</code>,然后</p>
<pre class="lang-py prettyprint-override"><code>import regex
a = 'your_string_here'
rx = r'^\s*(\w+)\s*#\s*(\((?:[^()]++|(?2))*\))\s*(\w+)'
matches = [(x.group(1), x.group(3)) for x in regex.finditer(rx, a, regex.M)]
</code></pre>
<p>这是<a href="https://regex101.com/r/BNGGYT/1" rel="nofollow noreferrer">regex demo</a>。它匹配:</p>
<ul>
<li><code>^</code>-行的开始</li>
<li><code>\s*</code>-零个或多个空格</li>
<li><code>(\w+)</code>-组1:一个或多个单词字符</li>
<li><code>\s*#\s*</code>-a<code>#</code>包含零个或多个空格</li>
<li><code>(\((?:[^()]++|(?2))*\))</code>-第2组:一个<code>(</code>字符,然后是除<code>(</code>和<code>)</code>或第2组模式以外的任何一个或多个字符的任何零次或多次出现,然后是一个<code>)</code></li>
<li><code>\s*</code>-零个或多个空格</li>
<li><code>(\w+)</code>-第2组:一个或多个单词字符</李>
</ul>