<p>您的惊人结果与正则表达式量词<code>*</code>有关。在</p>
<p>考虑:</p>
<pre><code>[a-z]*
</code></pre>
<p><img src="https://www.debuggex.com/i/YBDzadvXGTfIDaci.png" alt="Regular expression visualization"/></p>
<p><a href="https://www.debuggex.com/r/YBDzadvXGTfIDaci" rel="nofollow">Debuggex Demo</a></p>
<p>对比:</p>
^{pr2}$
<p><img src="https://www.debuggex.com/i/K2Bukobv3YIH8Kh2.png" alt="Regular expression visualization"/></p>
<p><a href="https://www.debuggex.com/r/K2Bukobv3YIH8Kh2" rel="nofollow">Debuggex Demo</a></p>
<p>作为另一个例子,我认为它更能说明你所看到的:</p>
<pre><code>>>> re.findall(r'[a-z]*', '123456789')
['', '', '', '', '', '', '', '', '', '']
</code></pre>
<p>字符串<code>123456789</code>中的集合<code>[a-z]</code>中没有字符。然而,由于<code>*</code>的意思是'<strong>零</strong>或更多',<em>所有</em>字符<em>位置</em>“匹配”的方式是不匹配该位置的任何字符。在</p>
<p>例如,假设您只想测试字符串中是否有字母,并使用如下正则表达式:</p>
<pre><code>>>> re.search(r'[a-z]*', '1234')
<_sre.SRE_Match object at 0x1069b6988> # a 'match' is returned, but this is
# probably not what was intended
</code></pre>
<hr/>
<p>现在考虑一下:</p>
<pre><code>>>> re.findall(r'[a-z]*', '123abc789')
['', '', '', 'abc', '', '', '', '']
</code></pre>
<p>对比:</p>
<pre><code>>>> re.findall(r'([a-z])*', '123abc789')
['', '', '', 'c', '', '', '', '']
</code></pre>
<p>第一个模式是<code>[a-z]*</code>。部分<code>[a-z]</code>是与集合<code>a-z</code>中的一个<em>单个字符</em>匹配的字符类,除非修改;如果大于零,则添加<code>*</code>量词将贪婪地匹配尽可能多的字符——因此匹配“abc”,但也允许零个字符匹配(或者字符集之外的字符匹配位置,因为0是匹配的)。在</p>
<p>在<code>([a-z])*</code>中添加分组有效地将量化集中的匹配减少到单个字符,并返回集合中匹配的最后一个字符。在</p>
<p>如果您想获得分组的效果(比如在更复杂的模式中),请使用非捕获组:</p>
<pre><code>>>> re.findall(r'(?:[a-z])*', '123abc789')
['', '', '', 'abc', '', '', '', '']
</code></pre>