摘要:在閱讀這篇文章前最好把同系列文章實(shí)戰(zhàn)正則表達(dá)式一驗(yàn)證手機(jī)號先仔細(xì)閱讀一遍。但實(shí)際上這樣一個(gè)表達(dá)式是無法從上面的中提取第一個(gè)元素的這里主要的問題是在默認(rèn)情況下點(diǎn)號字符無法匹配換行符。但是很遺憾,正則表達(dá)式中沒有排除型子表達(dá)式或者說排除型分組。
這篇文章通過提取html元素介紹了正則表達(dá)式中模式修飾符、貪婪匹配與非貪婪匹配、Unicode模式、環(huán)視等知識點(diǎn)。
在閱讀這篇文章前最好把同系列文章php實(shí)戰(zhàn)正則表達(dá)式(一):驗(yàn)證手機(jī)號先仔細(xì)閱讀一遍。
有這樣一個(gè)表格
用戶名 | 職業(yè) |
---|---|
Kobe Bryant | 籃球運(yùn)動員 |
Jay Chou | 歌手、詞曲創(chuàng)作人、制作人、演員、導(dǎo)演 |
Lionel Messi | 足球運(yùn)動員 |
它的源碼如下:
用戶名 | 職業(yè) |
---|---|
Kobe Bryant | 籃球運(yùn)動員 |
Jay Chou | 歌手、詞曲創(chuàng)作人、制作人、演員、導(dǎo)演 |
Lionel Messi | 足球運(yùn)動員 |
現(xiàn)在要提取第一個(gè) s+ 其中 s是php實(shí)戰(zhàn)正則表達(dá)式(一):驗(yàn)證手機(jī)號介紹過的字符組簡記法中的一個(gè),代表回車符、空格、制表符等空白字符 量詞+表示它所修飾的字符或字符組出現(xiàn)次數(shù)大于等于1 點(diǎn)號字符.在正則表達(dá)式中是一個(gè)特殊的元字符,它可以匹配“任意字符” 閉標(biāo)簽中的斜線/在php的正則表達(dá)式中是模式分隔符,所以需要轉(zhuǎn)義來表示斜線字符。 但實(shí)際上這樣一個(gè)表達(dá)式是無法從上面的中提取第一個(gè) 這里主要的問題是在默認(rèn)情況下點(diǎn)號字符.無法匹配換行符
。有兩個(gè)方法可以解決這個(gè)問題: 使用模式修飾符s,正則表達(dá)式為/s+ 用[sS]或[wW]或[dD]代替點(diǎn)號字符.來匹配所有字符,正則表達(dá)式為s+ 關(guān)于模式修飾符(Pattern Modifiers),這里需要詳細(xì)介紹一下(點(diǎn)擊這里查看php支持的所有模式修飾符)。模式修飾符可以改變正則表達(dá)式的一些默認(rèn)規(guī)則,常用的模式修飾符有i、s、U、u等,我們在后面會用到它們中的一些,這里不展開介紹每個(gè)模式修飾符的作用,后面用到了再具體介紹。這里主要對比一下/.../{modifier}與...(?{modifier})...兩種表示方法的區(qū)別。 從上面的gif中可以看到提取的結(jié)果中有三個(gè)tr,而不是只有一個(gè)。這是因?yàn)檎齽t表達(dá)式中量詞默認(rèn)是貪婪匹配,在這里,.*會匹配一切字符,直到最后沒有字符再向前回溯,回溯到中的最后一個(gè)時(shí)與正則表達(dá)式中的相匹配,從而完成整個(gè)匹配過程,最后的結(jié)果也就是包含了三個(gè) 可以使用模式修飾符U指定整個(gè)正則表達(dá)式為非貪婪模式,也可以使用非貪婪匹配量詞指定某一個(gè)量詞為非貪婪模式:
指定整個(gè)正則表達(dá)式為非貪婪模式: /s+ 或(?Us)s+ 非貪婪量詞: 完整的貪婪量詞(匹配優(yōu)先量詞)與非貪婪量詞(忽略優(yōu)先量詞)見下表: 假設(shè)我們想把表格中有關(guān)于運(yùn)動員的記錄都提取出來,我們可能會使用/ 這個(gè)表達(dá)式在Unicode編碼環(huán)境下可以匹配出結(jié)果,但是在GBK環(huán)境下就未必了。我們可以通過模式修飾符u來指定Unicode模式: / 在Unicode模式下,我們甚至可以使用碼值來代替漢字: / php正則中使用x{hex}的形式來表示Unicode字符的碼值,使用碼值的好處是可以結(jié)合字符組來表示一段范圍,如[x{4e00}-x{9fff}]表示匹配所有漢字字符。 上面的表達(dá)式可以匹配出結(jié)果,但是卻不正確。我們可以看到,它匹配了整個(gè)字符串的第一個(gè) 這里兩個(gè).*匹配到的字符都比預(yù)期要多。第二個(gè).*匹配字符比預(yù)期多的原因是正則表達(dá)式默認(rèn)是貪婪匹配模式,它會匹配剩余字符串中的每個(gè)字符,直到字符串的末尾,然后再向前回溯到最后一個(gè) 我們先看看使用非貪婪匹配時(shí)的結(jié)果: 可以看到,第二個(gè).*匹配的字符已經(jīng)是我們想要的了。那么,對于第一個(gè).*匹配字符比預(yù)期多這個(gè)問題怎么解決呢? 如果僅使用到目前為止我的文章中介紹的知識,也是有方法可以解決的。我們可以先從左到右匹配出所有的行( 當(dāng)然,我們也可以通過純粹的正則表達(dá)式來解決這個(gè)問題。如果有一定正則表達(dá)式使用經(jīng)驗(yàn)的朋友可能很容易聯(lián)想到排除型字符組,我們介紹過字符組[...],它表示在同一位置可能出現(xiàn)的字符。而排除型字符組則表示在同一位置不能出現(xiàn)的字符,它的形式是[^...],通過緊跟在開方括號[后面的^來表示排除型字符組。例如,[^d]表示匹配的字符是除了數(shù)字以外的任意字符。 / 環(huán)視(look-around)不匹配任何字符,用來“停在原地,四處張望”。上面的表達(dá)式使用了否定順序環(huán)視,它的形式是(?!...)。具體對于(.(?! 完整的環(huán)視有: 由于上面的正則表達(dá)式有一個(gè)分組(子表達(dá)式),所以匹配的結(jié)果除了下標(biāo)0,還有下標(biāo)1,這里下標(biāo)1的結(jié)果其實(shí)沒有什么用,我們可以用之前介紹過的非捕獲分組: / 我們的真正目的是提取所有包含“運(yùn)動員”的行,而上面只提取了第一個(gè),所以需要將preg_match函數(shù)換成preg_match_all。 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21126.html 摘要:上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)高級用法下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)與正則表達(dá)式抓取貓眼電影排行本節(jié)我們看一下正則表達(dá)式的相關(guān)用法,正則表達(dá)式是處理字符串的強(qiáng)大的工具,它有自己特定的語法結(jié)構(gòu),有了它,實(shí)現(xiàn)字符串的檢索替換匹配驗(yàn)證都不在話下。
上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---25、requests:高級用法下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼... 摘要:上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)與正則表達(dá)式抓取貓眼電影排行下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)解析庫的使用上一節(jié)我們實(shí)現(xiàn)了一個(gè)最基本的爬蟲,但提取頁面信息時(shí)我們使用的是正則表達(dá)式,用過之后我們會發(fā)現(xiàn)構(gòu)造一個(gè)正則表達(dá)式還是比較的繁瑣的,而且萬一有一點(diǎn)地
上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼電影排行下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---29、解析庫的使用:... 摘要:所以我們?nèi)绻氆@取電影,只需要分開請求次,而次的參數(shù)設(shè)置為,,,,即可,這樣我們獲取不同的頁面結(jié)果之后再用正則表達(dá)式提取出相關(guān)信息就可以得到的所有電影信息了。上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)正則表達(dá)式下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)解析庫的使用
上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---26、正則表達(dá)式下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---28、解析庫的使用:XPath
本節(jié)我們利用 Reque... 摘要:解析器在解析的時(shí)候?qū)嶋H上是依賴于解析器的,它除了支持標(biāo)準(zhǔn)庫中的解析器,還支持一些第三方的解析器比如,下面我們對支持的解析器及它們的一些優(yōu)缺點(diǎn)做一個(gè)簡單的對比。
上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---28、解析庫的使用:XPath下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---30、解析庫的使用:PyQuery
前面我們介紹了正則表達(dá)式的相關(guān)用法,但是一旦正則寫的有問題,可能得到的就... 小編寫這篇文章的主要目的,是來給大家做出一個(gè)介紹,介紹關(guān)于python爬蟲的一些技能技巧,包括怎么才能夠爬取pixiv圖片,作為一個(gè)小白來講,還是需要一定的實(shí)戰(zhàn)的,那么,具體的實(shí)戰(zhàn)技能,下面就給大家詳細(xì)的解答下?! ∽詮慕佑|python以后就想著爬pixiv,之前因?yàn)樘葑佑悬c(diǎn)問題就一直擱置,最近換了個(gè)梯子就迫不及待試了下?! ∨老x無非request獲取html頁面然后用正則表達(dá)式或者beaut... 閱讀 1981·2019-08-30 15:54 閱讀 3608·2019-08-29 13:07 閱讀 3131·2019-08-29 12:39 閱讀 1798·2019-08-26 12:13 閱讀 1555·2019-08-23 18:31 閱讀 2167·2019-08-23 18:05 閱讀 1856·2019-08-23 18:00 閱讀 1052·2019-08-23 17:15元素。最簡單的正則表達(dá)式應(yīng)該是這樣:
.*
元素的
.* /s或(?s)s+.* 。模式修飾符s的作用就是讓點(diǎn)號字符.可以匹配換行符。
[sS]*
模式修飾符
/.../{modifier}
...(?{modifier})...
示例
/
.* /s(?s).*
名稱(php手冊)
模式修飾符
模式內(nèi)修飾符
名稱(《正則指引》)
預(yù)定義常量
模式修飾符
作用范圍
整個(gè)正則表達(dá)式
不在分組(子表達(dá)式)中時(shí),對它后面的全部正則表達(dá)式起作用;如果在分組(子表達(dá)式)中,則對它分組中的剩余部分起作用。在沒有分組,且放在整個(gè)正則表達(dá)式最前面的時(shí)候相當(dāng)于/.../{modifier}
支持程度
支持所有模式修飾符
支持部分模式修飾符
其他編程語言
可能不支持
一般都支持
。
.* /Us
.*
/s+.*? /s
提取包含指定內(nèi)容的行
貪婪量詞
非貪婪量詞
限定次數(shù)
*
*?
可能出現(xiàn),可能不出現(xiàn),出現(xiàn)次數(shù)沒有上限
+
+?
至少出現(xiàn)1次,沒有上限
?
??
出現(xiàn)0次或1次
{m,n}
{m,n}?
出現(xiàn)次數(shù)大于等于m,小于等于n
{m,}
{m,}?
至少出現(xiàn)m次,沒有上限
{0,n}
{0,n}?
出現(xiàn)0次-n次
.*運(yùn)動員.* /s這樣的正則表達(dá)式。.*運(yùn)動員.* /us.*x{8fd0}x{52a8}x{5458}.* /us到最后一個(gè) 。
直覺上,我們是想正則表達(dá)式先去匹配“運(yùn)動員”,然后向左尋找最近的一個(gè),向右尋找最近的一個(gè) 。但事實(shí)上,正則表達(dá)式是從左往右匹配的,即從開始尋找,整個(gè)正則表達(dá)式的匹配情況見下表(空白字符沒有顯示出來)。
,可以通過指定非貪婪匹配模式來解決這個(gè)問題。但是第一個(gè).*匹配字符比預(yù)期多是正?,F(xiàn)象,因?yàn)檎齽t表達(dá)式是從左向右匹配的,表達(dá)式中的
表達(dá)式
匹配值
/
.*
用戶名 職業(yè) Kobe Bryant 籃球
運(yùn)動員
運(yùn)動員
.*
Jay Chou 歌手、詞曲創(chuàng)作人、制作人、演員、導(dǎo)演 Lionel Messi 足球運(yùn)動員
/us
匹配字符串中第一個(gè) ,后面的.*則匹配剩余的所有字符,直到字符串的末尾,然后再向前回溯到“運(yùn)動員”。
... ),方法是使用php中的preg_match_all函數(shù)結(jié)合非貪婪匹配模式;然后再遍歷每一行,過濾出其中包含“運(yùn)動員”的行即可。
如果有排除型子表達(dá)式,類似于(^)*,我們只需要指定第一個(gè).*把 排除就行了。但是很遺憾,正則表達(dá)式中沒有排除型子表達(dá)式或者說排除型分組。這種情況下,我們只能使用環(huán)視
(.(?! ))*運(yùn)動員.* /Us))*來分析,每當(dāng).匹配了一個(gè)字符后,就向右看看,如果當(dāng)前匹配字符的右邊沒有出現(xiàn) 就匹配成功。
名字
記法
含義
肯定順序環(huán)視
(?=...)
向右看看,右邊出現(xiàn)了環(huán)視中的內(nèi)容才匹配
否定順序環(huán)視
(?!...)
向右看看,右邊不出現(xiàn)環(huán)視中的內(nèi)容才匹配
肯定逆序環(huán)視
(?<=...)
向左看看,左邊出現(xiàn)了環(huán)視中的內(nèi)容才匹配
否定逆序環(huán)視
(?
向左看看,左邊不出現(xiàn)環(huán)視中的內(nèi)容才匹配
(?:.(?! ))*運(yùn)動員.* /Us相關(guān)文章
Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---26、正則表達(dá)式
Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---28、解析庫的使用:XPath
Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼電影排行
Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---29、解析庫的使用:BeautifulSoup
python爬蟲爬取pixiv圖片實(shí)戰(zhàn)詳解
發(fā)表評論
0條評論
ityouknow
男|高級講師
TA的文章
閱讀更多
百度MIP技術(shù)快速入門(上)
基于 vue + zhengAdmin 的一套后臺模板
H5前端常見問題
簡述Function類型
這篇文章, 讓你了解 JavaScript 中的原型(基礎(chǔ)篇-圖文)
判斷是否是閏年
cookie的學(xué)習(xí)之路
1.2 Node.js 安裝與使用-基礎(chǔ)配置-NodeJs+Express+Mysql實(shí)戰(zhàn)