之前未接觸過正規表示式,今日看python網路爬蟲的原始碼,裡面一行正規表示式匹配的**初看之下,不是很理解,**如下:
myitems = re.findall('(.*?)
',unicodepage,re.s)
「.*?」這種匹配方式,按理解應該是匹配任意字元0個或多個(re.s模式,「.」可以匹配「\n」),但是這個「?」總覺的在這兒是多餘的,既然不理解,就敲**試試:
import re
這個結果,應該說是意料之中,加個「?」呢?
import re
竟然是這個結果。。。「.
?」乙個字元都沒匹配,按「.」、「
」、「?」的匹配理解,也就是「*」「?」均匹配前面字元0次,才會是這個結果,可是為啥就是0次了?
這就是正規表示式貪婪模式和非貪婪模式:
貪婪模式,總是嘗試匹配盡可能多的字元;
非貪婪模式則相反,總是嘗試匹配盡可能少的字元。
python裡數量詞預設是貪婪的,這就解釋了第乙個匹配實驗,輸出結果為」www.baidu.com」(貪婪模式),也就是說第二個匹配實驗是非貪婪模式,僅僅因為加了「?」,繼續實驗
import re
此次匹配結果,顯然是貪婪模式。奇怪了,也就是「?」的特殊組合才是非貪婪模式。
網上搜尋得如下說明:
標準量詞修飾的子表示式,在可匹配可不匹配的情況下,總會先嘗試進行匹配,稱這種方式為匹配優先,或者貪婪模式。此前介紹的一些量詞,「」、「」、「」、「?」、「*」和「+」都是匹配優先的。
一些nfa正則引擎支援忽略優先量詞,也就是在標準量詞後加乙個「?」,此時,在可匹配可不匹配的情況下,總會先忽略匹配,只有在由忽略優先量詞修飾的子表示式,必須進行匹配才能使整個表示式匹配成功時,才會進行匹配,稱這種方式為忽略優先,或者非貪婪模式。忽略優先量詞包括「?」、「?」、「?」、「??」、「*?」和「+?」。
顯然「*?」的組合是非貪婪模式,猜想正確,原來如此啊。
還有就是, python 中字串前面加上 r 表示原生字串,與大多數程式語言相同,正規表示式裡使用 "\" 作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元 "\" ,那麼使用程式語言表示的正規表示式裡將需要4個反斜槓 "\\\\" :前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正規表示式裡轉義成乙個反斜槓。python裡的原生字串很好地解決了這個問題,這個例子中的正規表示式可以使用 r"\\" 表示。同樣,匹配乙個數字的 "\\d" 可以寫成 r"\d" 。有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。
\b 匹配乙個單詞邊界,也就是指單詞和空格間的位置。例如,「er\b」可以匹配「never」中的「er」,但不能匹配「verb」中的「er」。 \b 匹配非單詞邊界。「er\b」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。
match() 函式只檢測re是不是在string的開始位置匹配, search() 會掃瞄整個 string 查詢匹配, 也就是說 match() 只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話, match() 就返回 none
python 正規表示式 簡介
1.正規表示式 描述字串排列的一套規則 2.可以使用正規表示式提取出所有滿足規則的字串 3.在python中使用re模組是實現在python正規表示式的功能 正規表示式的基礎知識 1.原子 2.元字元 3.模式修正 原子 原子是正規表示式中最基礎的組成單位,每個正規表示式中至少包含乙個原子 1.普通...
Python正規表示式簡介
作者 i n alghani khalid 編譯 vk towards datas science 假設你要根據給定的查詢搜尋某個內容。如果你只依靠乙個字串,你就得不到你想要的東西。那麼,如何在海量資訊中尋找你需要的東西呢?當然,你需要乙個模式來識別你想要查詢的字串。為此,我們可以使用正規表示式 r...
正規表示式簡介
乙個正規表示式就是乙個模式,由與文字進行匹配的字串行組成。正規表示式有著廣泛的應用 grep sed vim make等等,某些指令碼語言如perl等更是將正規表示式納入語言內部。正規表示式由原子和運算子組成。最簡單的原子是單個字元,如果乙個正規表示式由單個字元組成,則該字元必須出現在目標文字的某處...