擅长:python、mysql、java
<p>问题是<code>re.match</code>只返回1个匹配,捕获组的数目是固定的</p>
<p>要匹配模式的多次出现,可以使用<code>re.findall</code>和<code>r'(\D*)(\d+)'</code>模式,将0+个非数字符号匹配并捕获到组1,然后将1+个数字捕获到组2:</p>
<pre><code>re.findall(r'(\D*)(\d+)', t)
</code></pre>
<p>因为<code>re.findall</code>只返回捕获的文本,所以您将得到一个2元素元组的列表</p>
<h3>使用PyPi regex模块的替代解决方案</h3>
<p>您既可以<em>验证</em>字符串,也可以轻松地<em>捕获</em>具有<a href="https://pypi.python.org/pypi/regex" rel="nofollow noreferrer">PyPi regex module</a>的多对组的所有出现,如下所示:</p>
<pre><code>>>> import regex
>>> t = "Fe35C65"
>>> pat = r"(?:(\D*)(\d+))+"
>>> m = regex.fullmatch(pat, t)
>>> if m:
print(zip(m.captures(1), m.captures(2)))
[('Fe', '35'), ('C', '65')]
</code></pre>
<p>关键是:</p>
<ul>
<li><code>(?:(\D*)(\d+))+</code>匹配(第1组)0+非数字和(第2组)1+数字的1+次出现(<em>提取</em>)</li>
<li><code>regex.fullmatch</code>要求整个字符串与模式匹配(<em>验证</em>)</li>
<li>捕获存储在组捕获堆栈中,可以使用<code>.captures(n)</code>访问</李>
</ul>