正則表達式中:.*,.*?,.+?的理解與應用


1、 .*    貪婪模式

. 表示 匹配除換行符 \n 之外的任何單字符,*表示零次或多次。所以.*在一起就表示任意字符出現零次或多次。沒有?表示貪婪模式。比如a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。

比如模式src='.*', 它將會匹配最長的以 src='開始,以`結束的最長的字符串。用它來搜索 <img src='test.jpg' width='60px' height='80px'/> 時,將會返回 src='test.jpg' width='60px' height='80px'

 

2、 .*?   懶惰模式

?跟在*或者+后邊用時,表示懶惰模式。也稱非貪婪模式就是匹配盡可能少的字符。就意味着匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。
a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)。
又比如模式 src=`.*?`,它將會匹配 src=` 開始,以 ` 結束的盡可能短的字符串。且開始和結束中間可以沒有字符,因為*表示零到多個。用它來搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``。

 

3、 .+?  懶惰模式

同上,?跟在*或者+后邊用時,表示懶惰模式。也稱非貪婪模式。就意味着匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復
a.+?b匹配最短的,以a開始,以b結束的字符串,但a和b中間至少要有一個字符。如果把它應用於ababccaab的話,它會匹配abab(第一到第四個字符)和aab(第七到第九個字符)。注意此時匹配結果不是ab,abaab。因為a和b中間至少要有一個字符。
又比如模式 src=`.+?`,它將會匹配 src=` 開始,以 ` 結束的盡可能短的字符串。且開始和結束中間必須有字符,因為+表示1到多個。用它來搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 時,將會返回 src=``test.jpg`。注意與.*?時的區別,此時不會匹配src=``,因為src=` 和 ` 之間至少有一個字符。

 

示例:

爬取源代碼中的:影片名稱、評分、圖片等信息。

 

分析源碼:

step1: 可以看到一部電影信息對應的源代碼是一個 li 節點,我們用正則表達式來提取這里面的一些電影信息,首先我們需要提取它的電影名稱信息,而它的電影名稱信息是在 class 為 "list-item"的節點后,所以這里利用非貪婪匹配來提取data-title屬性的信息,正則表達式寫為:

<li.*?list-item.*?data-title="(.*?)".*?>

step2: 使用同樣的的判斷方面來提取dat-score屬性的信息,正則表達式寫為:

<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>

step3: 隨后我們需要提取電影的圖片,可以看到在a節點內部有img節點,該節點下面有src屬性是圖片的鏈接,所以在這里提取img節點的src屬性,所以正則可以改寫如下:

<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.*?<img.*?src="(.*?)".*?/>
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM