上一篇python正則匹配次數大家應該也發現了,除了?其他匹配次數規則都是盡可能多的匹配
那如果只想匹配1次怎么辦呢,這就是正則中非貪婪模式的概念了
原理就是利用?與其他匹配次數規則進行組合
單個匹配規則:
* = {0,}表示匹配0-n次
+ = {1,}表示匹配1-n次
?= {0,1}表示匹配0-1次
三者可組合成非貪婪模式匹配次數解析:*? +? ??
簡而言之:它們必須結合左右的子串進行匹配,左邊正則必須非空,右邊正則可以為空,中心思想就是在匹配到右邊的正則之前盡可能少次匹配左邊的正則
match是從頭開始匹配,找到第一個符合條件的子字符串
?? =(reg1?)?reg2 = (reg1{0,1}){0,1}reg2
In [149]: re.match(r'\w??\d','123wer123') # 第一個\d即數字之前,\w只能匹配0-1次; 這里第一個\d之前可匹配\w 0次,返回第一個數字 Out[149]: <re.Match object; span=(0, 1), match='1'> In [150]: re.match(r'\w??\d','w123wer123') # 第一個\d數字之前,\w只能i匹配0-1次;這里第一個\d之前\w匹配到一次,返回一個字母+第一個數字 Out[150]: <re.Match object; span=(0, 2), match='w1'> In [151]: re.match(r'\w??\d','wx123wer123') # 第一個\d數字之前,\w只能匹配0-1次; 這里\d前面匹配到\w 2次,match失敗,返回None In [152]: re.match(r'\w??\d','wxwer') #\d至少匹配1次; 這里\d沒匹配到,所以最終match失敗,返回None In [153]: re.match(r'\w??','wxwer') # \w只能匹配0-1次;這里選少的匹配0次 Out[153]: <re.Match object; span=(0, 0), match=''>
*? =(reg1*)?reg2 = (reg1{0,}){0,1}reg2
In [154]: re.match(r'\w*?\d','123wer123') # 第一個\d前\w只能匹配0-n次; 這里\d前可匹配0次\w, 返回第一個數字 Out[154]: <re.Match object; span=(0, 1), match='1'> In [155]: re.match(r'\w*?\d','wx123wer123') # 第一個\d前\w只能匹配0-n次;這里\d前匹配2次\w, 返回2個字母+一個數字 Out[155]: <re.Match object; span=(0, 3), match='wx1'> In [156]: re.match(r'\w*?\d','wxe') # \d至少要匹配一次;這里\d沒有匹配項,最終匹配失敗,返回None In [157]: re.match(r'\w*?','wxe') # \w只能匹配0-n次; 這里最少匹配0次 Out[157]: <re.Match object; span=(0, 0), match=''>
+? =(reg1+)?reg2 = (reg1{1,}){0,1}reg2
In [160]: re.match(r'\w+?\d','%123wer123') # 第一個\d前\w匹配只能匹配1-n次;這里第一個\d前\w只匹配到0次,最終match失敗,返回None In [161]: re.match(r'\w+?\d','wsx123wer123') #第一個\d前\w只能匹配1-n次;這里第一個\d前\w最少匹配3次,最后返回三個字母+第一個數字 Out[161]: <re.Match object; span=(0, 4), match='wsx1'> In [162]: re.match(r'\w+?\d','wsxwer') # \d必須至少匹配到一次;這里\d匹配0次,最終匹配失敗,返回None In [163]: re.match(r'\w+?','wsxwer') # \w只能匹配1-n次;這里\w最少可匹配1次,即返回第一個字母 Out[163]: <re.Match object; span=(0, 1), match='w'>
In [165]: re.match(r'w+?\w','wsxwer') # 第一個\w之前,w只能出現1-n次;這里w最少可匹配到一次,所以返回w+第一個字母
Out[165]: <re.Match object; span=(0, 2), match='ws'>
In [27]: re.match(r'aw+?\w','awwsxwer') # 第一個字母必須是a,在a和\w之間,w可出現1-n次; 這里w最少可匹配到1次
Out[27]: <re.Match object; span=(0, 3), match='aww'>
#延伸思考32和33分別返回什么呢,答案見評論
In [32]: re.match(r'aw+?s','awawsxwer')
In [33]: re.match(r'(aw)+?s','awawsxwer')