re模組中的非貪婪匹配

2022-06-23 23:51:13 字數 1089 閱讀 1567

python的re模組中有貪婪匹配和非貪婪匹配之分,當使用*時會匹配零個或多個,使用+時會匹配乙個或多個.當使用?在前邊特殊符號前時會進行非貪婪匹配,匹配零個或者乙個,今天主要討論非貪婪匹配中存在的坑.

import re

res = 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 re

ret = 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...