<p>使用lookaheads中的捕获组以任意顺序获取它们。还要注意的是,您应该使用<code>\d</code>而不是<code>[0-9]</code>,如果您希望<em>单独的</em>命名捕获组(例如<code>_A</code>部分使用<code><A></code>,而<code><B></code>部分使用<code>_B</code>),则应该使用单独的捕获组名称而不是重复<code><A></code>:</p>
<pre><code>(?P<basename>\w+(?=_))(?=.*?_A(?P<A>\d+x\d+))(?=.*?_B(?P<B>\d+x\d+))(?=.*?_C(?P<C>\d+x\d+))(?=.*?_D(?P<D>\d+x\d+))
</code></pre>
<p><a href="https://regex101.com/r/Ew2uQ2/3" rel="nofollow noreferrer">https://regex101.com/r/Ew2uQ2/3</a></p>
<p>分开:</p>
<ul>
<li><code>(?P<basename>\w+(?=_))</code>-匹配初始<code>base_</code>子串</li>
<li><code>(?=.*?_A(?P<A>\d+x\d+))</code>-捕获最近的<code>A_</code></li>
<li><code>(?=.*?_B(?P<B>\d+x\d+))</code>-捕获最近的<code>B_</code></li>
<li><code>(?=.*?_C(?P<C>\d+x\d+))</code>-捕获最近的<code>C_</code></li>
<li><code>(?=.*?_D(?P<D>\d+x\d+))</code>-捕获最近的<code>D_</code></li>
</ul>
<p>如果您事先不知道大写前缀,并且仍然需要纯regex解决方案,则可以使用<code>regex</code>模块捕获重复的子组:</p>
<pre><code>import regex
str = 'base_D2363x45_B534x5_C654x6_A23x4'
match = regex.match(r'(?P<basename>\w+?(?=_))(_[A-Z]+\d+x\d+)+', str)
print(match.captures(2))
</code></pre>
<p>输出:</p>
<pre><code>['_D2363x45', '_B534x5', '_C654x6', '_A23x4']
</code></pre>