對正規表示式貪婪模式與非貪婪模式的理解

2021-10-02 14:13:24 字數 1648 閱讀 2450

#python 3.7

import re

str = 『a "witch" and her "broom" is one』

a = re.findall(r'"(.*)"',str)

print(a)

#python 3.7

import re

str = 『a "witch" and her "broom" is one』

a = re.findall(r'"(.*)"',str)

print(a)

執行結果:

['witch" and her "broom']

在這裡為了直觀,我們模擬一下正則引擎

1.第乙個查詢字元是",正則引擎在第三個位置匹配到了它:

2.之後,引擎嘗試匹配正則的剩餘部分,第二個字元是.(點),它代表任意字元。引擎匹配到了w:

3.*代表任意字元重複一次到多次,因此正則引擎匹配到所有字元

4.當文字結束後,點的匹配停止了,但仍然有剩餘的正則"需要匹配,因此正則引擎開始倒過來回溯,換句話說,就是乙個字元乙個字元縮減匹配。

當匹配縮減後,它開始嘗試匹配剩餘的正則,但"沒有匹配上字元e。

5.因此正則繼續縮減.所重複的字元,繼續嘗試。

邊縮減一位,邊驗證匹配一位

6.正則引擎回溯,一次一次縮減.重複的字元個數,直到剩餘的正則都匹配上:

現在"終於匹配上了。

所以說,在貪婪模式下,正則引擎盡可能多的匹配字元

非貪婪模式和貪婪模式相反,可通過在代表數量的識別符號後放置?來開啟非貪婪模式,如?、+?甚至是??。

示例:

#python 3.7 

import re str = 'a "witch" and her "broom" is one'

a = re.findall(r'"(.*?)"',str)

print(a)

執行結果:

['witch', 'broom']

1.第一步和上面類似,引號"被匹配上

2.第二步也一樣, '.'被匹配上

3.下面是二者的重要區別。 正則引擎嘗試用最小可能的重複次數來進行匹配,因此在.(點)匹配了w後,它立即嘗試"的匹配

可惜沒有匹配上,因為i!="

4..(點)重複更多的字元,再進行嘗試

又沒匹配上,繼續~~

5.下面終於匹配上了

6.因為findall匹配全部字串所以繼續往後進行

同樣的道理

所以說,在非貪婪模式下,正則引擎盡可能少的重複匹配字元。

貪婪模式:.(點)先全部進行匹配完,如果還有沒有匹配的正則字元,則用未匹配的進行回溯

非貪婪模式:.匹配乙個任意字元,下乙個接著匹配.後的正則字元,如果下乙個匹配失敗,繼續用.匹配,然後在用.後正則字元匹配,直到.後的正則字元匹配成功。

正規表示式貪婪與非貪婪模式

之前做程式的時候看到過正規表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。1.什麼是正規表示式的貪婪與非貪婪匹配 如 string str abcaxc patter p ab c 貪婪匹配 正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使...

正規表示式貪婪與非貪婪模式

1.什麼是正規表示式的貪婪與非貪婪匹配 如 string str abcaxc patter p ab c 貪婪匹配 正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字串str,結果就是匹配到 abcaxc ab c 非貪婪匹配 就是匹配到結果就好,就少的匹配字元。如上面...

正規表示式 貪婪非貪婪模式

貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分nfa引擎所支援。1.舉乙個例子 string str abcaxc patter p ab.c 貪婪匹配 正規表...