python的re模組中有貪婪匹配和非貪婪匹配之分,當使用*時會匹配零個或多個,使用+時會匹配乙個或多個.當使用?在前邊特殊符號前時會進行非貪婪匹配,匹配零個或者乙個,今天主要討論非貪婪匹配中存在的坑.
import reres = re.findall('a?','aaa')
print(res)
#['a', 'a', 'a', '']
res1 = re.findall('pa?','paaa')
print(res1)
#['pa']
res2 = re.findall('.?','aaaa')
print(res2)
#['a', 'a', 'a', 'a', '']
從上邊例子中可以看出,當帶有'?'的部分單獨處於正則開頭並且後邊沒有其它匹配條件時,匹配結果會多匹配一次,所以在res和res2中會多匹配乙個空格;而當'?'部分在正則的中間或者尾部時,則不會出現多一次的情況,所以在res1中結果是'pa'.此時有人會問為什麼res會匹配出空格,而res1在沒匹配到時候沒有空格?看下邊的例子:
import reret = re.findall('paa?','papaaa')
print(ret)
#['pa', 'paa']
ret1 = re.findall('(paa)?','papaaa')
print(ret1)
#['', '', 'paa', '', '']
ret2 = re.findall('a(?:paa)?','apapaaa')
print(ret2)
#['a', 'apaa', 'a']
上邊例子中可以看出,只有當正規表示式只有乙個單獨的分組或者元字元時,加上'?'如果匹配不到才會出現空格,而且在ret1中可以看出,多匹配了一次空格.當正則是一串字元時,匹配出的就沒有空字元,所以ret結果為['pa', 'paa'].
綜上所述:當正規表示式中是以帶'?'的部分開頭並且沒有其它匹配內容時,匹配不到會出現空字元,並且會多匹配一次;而當使用兩個'?'時,結果肯定是匹配零個;如果正則是乙個分組(即乙個單獨的整體時)才會匹配出空字元.
re 正則匹配的非貪婪匹配
非貪婪匹配 將盡可能少的匹配內容,當?出現在其他的重複次數後面時會將貪婪模式改為非貪婪模式。如 abc.abc.非貪婪匹配 盡可能少的匹配?號表示 號前面的字元出現0 無數個 號表示最少匹配 號表示 號前面的字元出現1 無數個 表示0 1個 print re.findall r ab aababba...
python基礎 re模組匹配時貪婪和非貪婪模式
python貪婪和非貪婪 正規表示式通常用於在文字中查詢匹配的字串。python裡數量詞預設是貪婪的 在少數語言裡也可能是預設非貪婪 總是嘗試匹配盡可能多的字元 非貪婪則相反,總是嘗試匹配盡可能少的字元。在 後面加上?使貪婪變成非貪婪。s this is a number 234 235 22 42...
python re模組匹配貪婪和非貪婪模式詳解
python貪婪和非貪婪 正規表示式通常用於在文字程式設計客棧中查詢proouv匹配的字串。python裡數量詞預設是貪婪的 在少數語言裡也可能是預設非貪婪 總是嘗試匹配盡可能多的字元 非貪婪則相反,總是嘗試匹配盡可能少的字元。在 後面加上?使貪婪變成非貪婪。s this is a number 2...