擅长:python、mysql、java
<p>问题不是因为中的<code>|</code>字符:</p>
<pre><code> |(\[(eax|ebx)\]) # memory access with registers
</code></pre>
<p>这是因为表达式的这一部分定义了<strong>两个</strong>捕获组,一个嵌套在另一个组中—因此<code>match.groups()</code>返回的值比解包的要多,例如第一行:</p>
^{pr2}$
<p>避免嵌套组的一种方法是使用:</p>
<pre><code> |(\[eax\]|\[ebx\]) # memory access with registers
</code></pre>
<p>这将导致返回:</p>
<pre><code>(None, None, None, '[eax]')
</code></pre>
<p>正如@Shashank指出的,您还可以使用<strong>非</strong>-capturing group<code>(?:...)</code>语法来定义嵌套的可能寄存器值模式:</p>
<pre><code> |(\[(?:eax|ebx)\]) # memory access with registers
</code></pre>
<p>达到同样的目的。当有更多的可能的子模式(而且它们更复杂)时,这种方法是有利的,因为否则你需要为每种可能性详细说明整个模式,而不是利用它们可能具有的一些共性。在</p>