<h3>例1</h3>
<pre><code>re.findall(r'[a-z]*',"f233op")
</code></pre>
<p>此模式匹配零个或多个小写字母字符实例。零或更多的部分在这里是关键的,因为从字符串中的每个索引位置开始的无任何匹配与<code>f</code>或{<cd2>}的匹配一样有效。返回的最后一个空字符串是从字符串结尾开始的匹配项(<code>p</code>和{<cd4>}(字符串结尾)之间的位置)。在</p>
<h3>例2</h3>
^{pr2}$
<p>现在,您正在匹配字符组,由一个小写字母组成。不再返回<code>o</code>,因为这是一个贪婪的搜索,并且将返回最后一个有效的匹配组。因此,如果您将字符串更改为<code>f233op12fre</code>,则将返回最后的<code>e</code>,但不会返回前面的<code>f</code>或{<cd9>}。同样,如果去掉字符串中的<code>p</code>,您仍然可以看到<code>o</code>作为有效匹配返回。在</p>
<p>相反,如果您试图通过添加<code>?</code>(例如<code>([a-z])*?</code>)使此正则表达式非贪心的,则返回的匹配集将全部为空字符串,因为有效的nothing匹配的优先级高于某个内容的有效匹配。在</p>
<h3>例3</h3>
<pre><code>re.findall(r'([a-z]*)',"f233op")
</code></pre>
<p>匹配的字符没有什么不同,但是现在返回的是字符组而不是原始匹配。此regex查询的输出将与第一个示例相同,但您会注意到,如果添加其他匹配组,您将突然看到将每个匹配尝试分组为元组的结果:</p>
<pre><code>IN : re.findall(r'([a-z]*)([0-9]*)',"f233op")
OUT: [('f', '233'), ('op', ''), ('', '')]
</code></pre>
<p>与相同的模式进行对比,去掉括号(组),你就会明白为什么它们很重要:</p>
<pre><code>IN : re.findall(r'[a-z]*[0-9]*',"f233op")
OUT: ['f233', 'op', '']
</code></pre>
<h3>还有…</h3>
<p>将这些regex模式插入到<a href="http://www.regexplained.co.uk/" rel="nofollow">Regexplained</a>等regex图生成器中,可以看到模式匹配逻辑是如何工作的。例如,为了解释regex为什么总是返回空字符串匹配,请看一下模式<a href="http://tinyurl.com/owzux3h" rel="nofollow">^{<cd14>}</a>和{a3}之间的区别。在</p>
<p>如果遇到问题,不要忘了检查<a href="http://docs.python.org/2/library/re.html" rel="nofollow">Python docs for the ^{<cd16>} library</a>,它们实际上对标准regex语法给出了相当出色的解释。在</p>