python正則非貪婪模式


上一篇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')

 

復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM