創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
網(wǎng)站設(shè)計(jì)制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺(tái)管理系統(tǒng);成都網(wǎng)站制作、做網(wǎng)站收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運(yùn)營(yíng)了10年的創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司。這篇文章主要介紹Python爬蟲之正則表達(dá)式是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
正則表達(dá)式
正則表達(dá)式(regular expression)簡(jiǎn)稱(regex), 是一種處理字符串的強(qiáng)大工具。它作為一種字符串的匹配模式,用于查看指定字符串是否存在于被查找字符串中,替換指定字符串,或是通過匹配模式查找指定字符串。正則表達(dá)式在不同的語言里面,語法也基本是相同的,也就是說學(xué)會(huì)了一種語言的正則,再學(xué)習(xí)其它的就很快了。
其主要的匹配過程是:
先用正則語法定義一個(gè)規(guī)則(pattern)
然后用這個(gè)規(guī)則與你download的網(wǎng)頁字符串進(jìn)行對(duì)比,根據(jù)pattern提取你想要的數(shù)據(jù)。
好了,讓我們看看Python正則表達(dá)式的語法:
我們舉一個(gè)常遇到的一個(gè)例子。比如,一個(gè)人的郵箱是這樣的lixiaomei@qq.com,那么我們?nèi)绾螐囊淮蠖训淖址阉崛〕鰜砟兀?/p>
根據(jù)正則語法,我們可以這樣來定義一個(gè)pattern:\w+@\w+\.com
為什么這么定義呢?讓我們來看看。
"\w" 的意思是單詞字符[A-Za-z0-9_]。注意是 "單字符串",可以是A-Z或者a-z或者0-9或者_(dá)各國(guó)語言中的任意一個(gè)。
"+" 匹配前一個(gè)字符1次或無限次。那么 "\w+" 組合起來的意思就是匹配一次或無限多次的但字符串[A-Za-z0-9]組合的字符串。
"@" 是郵箱的特定字符,所以固定不變。
第二個(gè) "\w+" 與前一個(gè)是一個(gè)道理,匹配一次或無限次的[A-Za-z0-9]組合的字符串。
" \. " 的含義是將" . "轉(zhuǎn)義,因?yàn)?" . " 本身也是正則語法中的其中一種,為了真的得到 ".com" 而不是帶有功能的" . ", 所以在前面加上 "\" 轉(zhuǎn)義字符。
所以,不論是例子中的 lixiaomei@qq.com,還是其它如xiaoxiao@126.com之類的郵箱,只要符合規(guī)則全都可以匹配,怎么樣,簡(jiǎn)單吧!
問題來了,有的郵箱格式可是xiaoxiao@xxx.xxx.com這樣的!這樣的話上面的規(guī)則就不能用了。沒錯(cuò),上面的規(guī)則比較特殊,只能匹配單一格式的郵箱名。那么怎樣設(shè)計(jì)一個(gè)滿足以上兩種格式的pattern呢?看看這個(gè):\w+@(\w+\.)?\w+\.com
這個(gè)又是什么意思?
\w+@與之前一樣
(\w+\.)?中的“ ? ”是匹配0次或1次括號(hào)分組內(nèi)的匹配內(nèi)容,"()" 則表示被括內(nèi)容是一個(gè)分組,分組序號(hào)從pattern字符串起始往后依次排列。分組的概念非常重要,在后面 “匹配對(duì)象方法” 章節(jié)會(huì)著重介紹其如何使用。
\w+\.com與之前一樣
因?yàn)槭瞧ヅ?次或1次,那么就意味著括號(hào)內(nèi)的部分是可有可無的,所以這個(gè)pattern就可能匹配兩種郵箱格式。
“?”是0次或1次,那么 \w+@(\w+\.)*\w+\.com 模式就更厲害了," * " 可以匹配0次或無限次。
re模塊核心函數(shù)
上面簡(jiǎn)單的介紹了正則表達(dá)式的pattern是如何設(shè)置的,那么下一步我們就可以開始我們的提取工作了。在Python的re模塊中有幾個(gè)核心的函數(shù)專門用來進(jìn)行匹配和查找。
compile()函數(shù)
函數(shù)定義: compile(pattern, flag=0)
函數(shù)描述:編譯正則表達(dá)式pattern,然后返回一個(gè)正則表達(dá)式對(duì)象。
為什么要對(duì)pattern進(jìn)行編譯呢?《Python核心編程 》里面是這樣解釋的:
使用預(yù)編譯的代碼對(duì)象比直接使用字符串要快,因?yàn)榻忉屍髟趫?zhí)行字符串形式的代碼前都必須把字符串編譯成代碼對(duì)象。
同樣的概念也適用于正則表達(dá)式。在模式匹配發(fā)生之前,正則表達(dá)式模式必須編譯成正則表達(dá)式對(duì)象。由于正則表達(dá)式在執(zhí)行過程中將進(jìn)行多次比較操作,因此強(qiáng)烈建議使用預(yù)編譯。而且,既然正則表達(dá)式的編譯是必需的,那么使用預(yù)編譯來提升執(zhí)行性能無疑是明智之舉。re.compile()能夠提供此功能。
原來是這樣,由于compile的使用很簡(jiǎn)單,所以將在以下幾個(gè)匹配查找的函數(shù)使用方法中體現(xiàn)。
match()函數(shù)
函數(shù)定義: match(pattern, string, flag=0)
函數(shù)描述:只從字符串的最開始與pattern進(jìn)行匹配,匹配成功返回匹配對(duì)象(只有一個(gè)結(jié)果),否則返回None。
import re s1 = '我12345abcde' s2 = '.12345abcde' # pattern字符串前加 “ r ” 表示原生字符串 pattern = r'\w.+' # 編譯pattern pattern_compile = re.compile(pattern) # 對(duì)s1和s2分別匹配 result1 = re.match(pattern, s1) result2 = re.match(pattern, s2) print(result1) print(result2) >>> <_sre.SRE_Match object; span=(0, 11), match='我12345abcde'>
注意:
match函數(shù)是從最開始匹配的,意思是如果第一個(gè)字符就不匹配,那就直接玩完,返回None。
Python中pattern字符串前面的 " r " 代表了原生字符串的意思。
search()函數(shù)
函數(shù)定義: search(pattern, string, flag=0)
函數(shù)描述:與match()工作的方式一樣,但是search()不是從最開始匹配的,而是從任意位置查找第一次匹配的內(nèi)容。如果所有的字串都沒有匹配成功,返回None,否則返回匹配對(duì)象。
import re s1 = '我12345abcde' s2 = '+?!@12345abcde' # pattern字符串前加 “ r ” 表示原生字符串 pattern = r'\w.+' pattern_compile = re.compile(pattern) result1 = re.search(pattern_compile, s1) result2 = re.search(pattern_compile, s2) print(result1) print(result2) >>> <_sre.SRE_Match object; span=(0, 11), match='我12345abcde'> >>> <_sre.SRE_Match object; span=(4, 14), match='12345abcde'>
可以看到無論字符串最開始是否匹配pattern,只要在字符串中找到匹配的部分就會(huì)作為結(jié)果返回(注意是第一次匹配的對(duì)象)。
findall()函數(shù)
函數(shù)定義: findall(pattern, string [,flags])
函數(shù)描述:查找字符串中所有(非重復(fù))出現(xiàn)的正則表達(dá)式模式,并返回一個(gè)匹配列表
import re s1 = '我12345abcde' s2 = '+?!@12345abcde@786ty' # pattern字符串前加 “ r ” 表示原生字符串 pattern = r'\d+' pattern_compile = re.compile(pattern) result1 = re.match(pattern_compile, s2) result2 = re.search(pattern_compile, s1) result3 = re.findall(pattern_compile, s2) print(result1) print(result2) print(result3) >>> None >>> <_sre.SRE_Match object; span=(1, 6),
上面同時(shí)列出了match、search、findall三個(gè)函數(shù)用法。findall與match和search不同的地方是它會(huì)返回一個(gè)所有無重復(fù)匹配的列表。如果沒找到匹配部分,就返回一個(gè)空列表。
以上是Python爬蟲之正則表達(dá)式是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
文章名稱:Python爬蟲之正則表達(dá)式是什么-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://jinyejixie.com/article8/isjop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、ChatGPT、微信小程序、網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容