2.7 最短匹�模�¶

问题¶

你正在试�用正则表达�匹��个文本模�,但是它找到的是模�的最长�能匹�。 而你想修改它��查找最短的�能匹�。

解决方案¶

这个问题一般出现在需�匹�一对分隔符之间的文本的时候(比如引�包�的字符串)。 为了说明清楚,考虑如下的例�:

>>> str_pat = re.compile(r'"(.*)"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>

在这个例�中,模� r'\"(.*)\"' 的�图是匹�被�引�包�的文本。 但是在正则表达�中*�作符是贪婪的,因此匹��作会查找最长的�能匹�。 于是在第二个例�中�索 text2 的时候返回结果并�是我们想�的。

为了修正这个问题,�以在模�中的*�作符��加上?修饰符,就�这样:

>>> str_pat = re.compile(r'"(.*?)"')
>>> str_pat.findall(text2)
['no.', 'yes.']
>>>

这样就使得匹����贪婪模�,从而得到最短的匹�,也就是我们想�的结果。

讨论¶

这一节展示了在写包�点(.)字符的正则表达�的时候�到的一些常�问题。 在一个模�字符串中,点(.)匹�除了�行外的任何字符。 然而,如果你将点(.)�放在开始与结�符(比如引�)之间的时候,那么匹��作会查找符�模�的最长�能匹�。 这样通常会导致很多中间的被开始与结�符包�的文本被忽略掉,并最终被包�在匹�结果字符串中返回。 通过在 * 或者 + 这样的�作符��添加一个 ? �以强制匹�算法改�寻找最短的�能匹�。