此文为python正则表达式的高阶入门,正则基础入门请参考程序员入门基础:python的正则表达式。
一、贪婪匹配和非贪婪匹配
举例说明概念:
print('非贪婪匹配',re.search('el+?', 'hello world',re.I))print('贪婪匹配',re.search('el+', 'hello world',re.I))贪婪匹配 非贪婪匹配
从代码中可以看出:
贪婪模式:正则表达式一般趋向于最大字符长度的匹配,也就是所谓的贪婪匹配。如上面的结果为“ell”
非贪婪模式:在整个表达式匹配成功的前提下,尽可能最少长度的匹配,如上面的结果为“el”
二、量词匹配
常见的量词有*,+,?,{m,n}
re*匹配0个或多个的表达式。re+匹配1个或多个的表达式。re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式re{ n}匹配n个前面表达式。例如,"o{2}"不能匹配"god"中的"o",但是能匹配"good"中的两个o。re{ n,}精确匹配n个前面表达式。例如,"o{2,}"不能匹配"god"中的"o",但能匹配"gooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
在python中默认采用的是贪婪模式,使用非贪婪模式的话,只需要在量词后面直接加上一个问号”?”。其他的量词匹配都是尽可能多地满足匹配。
三、代码示例
import reprint('贪婪匹配',re.search('little.*', '2 little dogs ate my homework yesterday.',re.I))print('非贪婪匹配',re.search('little.*?', '2 little dogs ate my homework yesterday.',re.I))print('量词匹配长度为2',re.search('little.{2}', '2 little dogs ate my homework yesterday.',re.I))print('量词匹配长度至少为2',re.search('little.{2,}', '2 little dogs ate my homework yesterday.',re.I))print('量词匹配贪婪',re.search('little.{2,6}', '2 little dogs ate my homework yesterday.',re.I))print('量词匹配非贪婪',re.search('little.{2,6}?', '2 little dogs ate my homework yesterday.',re.I))贪婪匹配 非贪婪匹配 量词匹配长度为2 量词匹配长度至少为2 量词匹配贪婪 量词匹配非贪婪
.*表示匹配后续单个字符串的0个或多个
1、从代码中可以看出,默认的贪婪匹配“little.*”,只有找到单个字符串不满足或匹配结束时才会停止匹配。
2、而非贪婪匹配,只要是后续单个字符串有*(匹配0个或多个的表达式)个匹配就停止,故匹配结果为little。
3、组合匹配中,问号(?)配合其他量词使用,可以更好的控制匹配结果长度。
四、总结
python正则表达式的贪婪模式与非贪婪模式,可以简单理解是否加问号(?),但合理利用其他量词匹配(如*,+,{m,n}),可能会达到事半功倍的效果。