擅长:python、mysql、java
<p>问题是模式包含一个<code>*</code>量化的<code>*</code>量词:<code>(?:[a-zA-Z_][a-zA-Z0-9_]*|\.\.\.|,\s*)*</code>。必须避免使用这些嵌套的量词。如果你不能将备选方案重新安排到后面的(可选)组中,所有格量词或原子组通常会有所帮助。你知道吗</p>
<p>Python<code>re</code>不支持所有格量词,也不支持原子组。你知道吗</p>
<p>但是,可以使用具有模拟原子组的版本:</p>
<pre><code>\bfunction(?:\s+[a-zA-Z0-9._]*)?\(((?:(?=([a-zA-Z_][a-zA-Z0-9_]*))\2|\.\.\.|,\s*)*)\)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
</code></pre>
<p><code>[a-zA-Z_][a-zA-Z0-9_]*</code>子模式被放置到一个捕获组中,该捕获组被一个正的lookback包围。<code>(?=([a-zA-Z_][a-zA-Z0-9_]*))\2</code>几乎等同于<code>[a-zA-Z_][a-zA-Z0-9_]*</code>(因为它匹配相同的内容),但它使子模式原子化(因此,在其他方面它看起来像<code>[a-zA-Z_][a-zA-Z0-9_]*+</code>或<code>(?>[a-zA-Z_][a-zA-Z0-9_]*+)</code>)。<code>\2</code>回溯引用的“原子”性质不会让回溯超出<code>[a-zA-Z_][a-zA-Z0-9_]*</code>。你知道吗</p>
<p>参见<a href="https://regex101.com/r/xV3dD4/3" rel="nofollow">regex demo</a>。你知道吗</p>
<p>另外,您可能需要<code>re.search</code>,因为您的模式以<code>\b</code>开头。请注意,<code>re.match</code>只能在字符串的开头找到匹配项(=它被锚定在字符串的开头)。你知道吗</p>