#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 貪婪匹配 正規表...