版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《Python語言程序設(shè)計》項目十一Python爬蟲基礎(chǔ)Contents了解爬蟲概念掌握如何解析復(fù)雜HTML頁面掌握正則表達式的基礎(chǔ)語法掌握re模塊的使用認識爬蟲PART01Web爬蟲的基本概念Web爬蟲=Webcrawler=Webspider=WebrobotWeb爬蟲是一種自動地、有條理地下載Web頁面的程序。Web爬蟲用于獲取最新的Web數(shù)據(jù)。認識爬蟲為什么要使用Web爬蟲?Web信息處理(如關(guān)鍵詞搜索等)需要用到兩類數(shù)據(jù):1、超文本文檔2、超文本文檔間通過超鏈接構(gòu)成的Web圖(WebGraph)獲取這兩類數(shù)據(jù)非常困難!數(shù)量巨大、帶寬有限、服務(wù)器控制、動態(tài)更新認識爬蟲直觀的解決方案從若干網(wǎng)頁開始,分析其中所包含的超鏈接,然后獲取這些鏈接所指向的頁面,此過程不斷迭代執(zhí)行,直至獲取了全部頁面為止。Web信息獲取=Web圖的遍歷廣度優(yōu)先搜索(BFS)深度優(yōu)先搜索(DFS)認識爬蟲簡單遍歷方法的不足BFS的缺點:
網(wǎng)頁訪問局部性差
網(wǎng)絡(luò)通信開銷大DFS的缺點: Web服務(wù)器負載重
吞吐率低 Web數(shù)據(jù)獲取程序易落入“陷阱”原因:未考慮網(wǎng)絡(luò)通信資源的約束認識爬蟲Web爬蟲的主要應(yīng)用搜索引擎
Web爬蟲自動下載搜索引擎所需的網(wǎng)頁; 搜索引擎分析這些網(wǎng)頁并建立索引。信息內(nèi)容安全
Web爬蟲自動下載最新的網(wǎng)頁; 檢查這些網(wǎng)頁是否包含特定關(guān)鍵詞。信息搜集
Web爬蟲自動下載最新的網(wǎng)頁; 提取這些網(wǎng)頁中包含的Email地址。認識爬蟲Web爬蟲的基本工作原理認識爬蟲Web爬蟲的基本工作原理初始化在優(yōu)先級隊列中加入起始URL地址D1,…,Ds頁面獲取從優(yōu)先級隊列中取出地址Di從地址Di獲取頁面P(Di)解析頁面P(Di)中的超鏈接和網(wǎng)頁信息將P(Di)中網(wǎng)頁信息加入網(wǎng)頁數(shù)據(jù)庫將P(Di)中未被訪問過的超鏈接加入優(yōu)先級隊列中終止條件:獲取了“足夠多”的網(wǎng)頁認識爬蟲Web爬蟲的基本組成調(diào)度器:決定下一個需要下載的網(wǎng)頁的URL下載器:根據(jù)調(diào)度器給出的URL,從Web上下載網(wǎng)頁URL隊列:排序待訪問的URL和過濾已訪問的URL網(wǎng)頁數(shù)據(jù)庫:存儲和管理已下載的網(wǎng)頁認識爬蟲在Python2中,有urllib和urllib2兩個庫來實現(xiàn)請求的發(fā)送。而在Python3中已經(jīng)不存在urllib2這個
庫了,統(tǒng)一為urllib。urllib庫,他是Python內(nèi)置的HTTP請求庫,也就是說不需要額外安裝即可使用。它包含如下4個模塊:request:它是最基本的HTTP請求模塊,可以用來模擬發(fā)送請求。error:異常處理模塊,如果出現(xiàn)請求錯誤,我們可以捕獲這些異常并處理。parse:一個工具模塊,提供許多URL的處理方法。robotparser:主要是用來識別網(wǎng)站的robots.txt文件,用來判斷哪些網(wǎng)站是可以爬的。認識爬蟲urllib類庫在Python2中,有urllib和urllib2兩個庫來實現(xiàn)請求的發(fā)送。而在Python3中已經(jīng)不存在urllib2這個庫了,統(tǒng)一為urllib。urllib庫,他是Python內(nèi)置的HTTP請求庫,也就是說不需要額外安裝即可使用。它包含如下4個模塊:request:它是最基本的HTTP請求模塊,可以用來模擬發(fā)送請求。error:異常處理模塊,如果出現(xiàn)請求錯誤,我們可以捕獲這些異常并處理。parse:一個工具模塊,提供許多URL的處理方法。robotparser:主要是用來識別網(wǎng)站的robots.txt文件,用來判斷哪些網(wǎng)站是可以爬的?;A(chǔ)類庫發(fā)送請求使用urllib.request模塊,我們可以方便的實現(xiàn)請求的發(fā)送并得到響應(yīng)。urllib.request模塊提供了最基本的構(gòu)造HTTP請求的方法,利用它可以摸擬瀏覽器的一個請求發(fā)起過程,同時它還帶有處理授權(quán)驗證(authenticaton)、重定向(redirection)、瀏覽器Cookies及其他內(nèi)容?;A(chǔ)類庫發(fā)送請求urlopen()舉例下面我們來看一下它的強大之處,這里以百度首頁為例,我們來把這個網(wǎng)頁抓下來:這里我們只用了兩行代碼,便完成了百度首頁的抓取,輸出了網(wǎng)頁的源代碼。1 #導(dǎo)入模塊2 importurllib.request3 #先服務(wù)器發(fā)出請求4 response=urllib.request.urlopen('')5 #獲得瀏覽器響應(yīng)的內(nèi)容并設(shè)置編碼6 print(response.read().decode('utf-8'))基礎(chǔ)類庫urlopen語法由上我們知道利用urlopen()方法可以實現(xiàn)最基本的請求發(fā)起,用于實現(xiàn)對目標url的訪問。直接用urllib.request模塊的urlopen()獲取頁面,page的數(shù)據(jù)格式為bytes類型,需要decode()解碼,轉(zhuǎn)換成str類型。函數(shù)原型如下:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)url:需要打開的網(wǎng)址data:Post提交的數(shù)據(jù)timeout:設(shè)置網(wǎng)站的訪問超時時間基礎(chǔ)類庫Request類庫
我們知道利用urlopen()方法可以實現(xiàn)最基本請求的發(fā)起,但這幾個簡單的參數(shù)并不足以構(gòu)建一個完整的請求。如果請求中需要加入Headers等信息,就可以利用更強大的Request類來構(gòu)建。首先,我們用實例來感受一下Request的用法:1 importurllib.request#導(dǎo)入模塊2 3 request=urllib.request.Request('')#構(gòu)建一個Request類4 response=urllib.request.urlopen(request)#發(fā)送請求,參數(shù)不再是URL,而是一個Request類型的對象5 print(response.read().decode('utf-8'))#打印獲得到的內(nèi)容基礎(chǔ)類庫Request語法
一個Request類型的對象,可以由多個更加豐富和靈活地配置參數(shù)組成。下面我們看一下Request可以通過怎樣的參數(shù)來構(gòu)造,它的構(gòu)造方法如下:urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)url:用于請求URL,這是必傳參數(shù),其他都是可選參數(shù)。data:如果要傳,必須傳bytes(字節(jié)流)類型的。如果它是字典,可以先用urllib.parse模塊里的urlencode()編碼。headers:是一個字典,它就是請求頭,我們可以在構(gòu)造請求時通過headers參數(shù)直接構(gòu)造,也可以通過調(diào)用請求實例的add_header()方法添加。unverifiable:表示這個請求是否是無法驗證的,默認是False。method:是一個字符串,用來指示請求使用的方法,比如GET、POST和PUT等?;A(chǔ)類庫復(fù)雜HTML解析PART02面對頁面解析難題時,很容易不假思索地直接寫幾行語句來提取信息。但是,像這樣魯莽放縱地使用技術(shù),只會讓程序變得難以調(diào)試或脆弱不堪,甚至二者兼?zhèn)洹T陂_始解析網(wǎng)頁之前,讓我們看一些可以避免解析復(fù)雜HTML頁面的方式。假如你已經(jīng)確定了目標內(nèi)容,可能是一個名字、一組統(tǒng)計數(shù)據(jù)或者一段文字。你的目標內(nèi)容可能隱藏在一個HTML“爛泥堆”的第20層標簽里,帶有許多沒用的標簽或HTML屬性,假如你不經(jīng)過考慮地直接寫出下面這樣一行代碼來提取內(nèi)容: bs.find_all(‘table’)[4].find_all(‘tr’)[2].find(‘td’).find_all(‘div’)[1].find(‘a(chǎn)’)雖然也可以達到目標,但是這樣看起來并不是很好。除了代碼欠缺美感之外,還有一個問題是,即便網(wǎng)絡(luò)管理員對網(wǎng)站稍作修改,這行代碼也會失效,甚至可能會毀掉整個網(wǎng)絡(luò)爬蟲。那么如果網(wǎng)站開發(fā)人員決定增加一張表格或者增加一列數(shù)據(jù),你應(yīng)該怎么做呢?如果網(wǎng)站開發(fā)人員在頁面的頂部增加一個組件(一些div標簽),你應(yīng)該怎么做呢?以上的代碼是不安全的,它依賴于網(wǎng)站的結(jié)構(gòu)永遠不變。HTML解析那你可以怎么做呢?尋找“打印此頁”的連接,或者看看網(wǎng)站有沒有HTML樣式更友好的移動版(把自己的請求頭設(shè)置成處于移動設(shè)備的狀態(tài),然后接收網(wǎng)站移動版)尋找隱藏在JavaScript文件里的信息。要是這一點,你可能需要查看網(wǎng)頁加載的JavaScript文件。雖然網(wǎng)頁標題經(jīng)常會用到,但是這個信息也許可以從網(wǎng)頁的URL連接里獲取。如果你要找的信息只存在于一個網(wǎng)站上,別處沒有,那你確實是運氣不佳,如果不只限于這個網(wǎng)站,那么你可以找找其他數(shù)據(jù)源。有沒有其他網(wǎng)站也顯示了同樣的數(shù)據(jù)?網(wǎng)站上顯示的數(shù)據(jù)是不是從其他網(wǎng)站上抓取后攢出來的?尤其是在面對埋藏很深或格式不友好的數(shù)據(jù)時,千萬不要不經(jīng)思考就寫代碼,一定要三思而后行。如果你確定自己不能另辟蹊徑,那么本章的內(nèi)容就是為你準備的。接下來會介紹基于位置、上下文、屬性和內(nèi)容選擇標簽的標準方式和創(chuàng)新方式。HTML解析這一節(jié)將介紹通過屬性查找標簽的方法,標簽組的使用,以及標簽解析樹的導(dǎo)航過程?;旧?,你遇到的每個網(wǎng)站都有層疊樣式表(cascadingstylesheet,CSS)。雖然你可能會認為,專門為了讓瀏覽器和人類可以理解網(wǎng)站內(nèi)容而設(shè)計一個展現(xiàn)樣式的層,是一件愚蠢的事,但是CSS的發(fā)明確實是網(wǎng)絡(luò)爬蟲的福音。CSS可以讓HTML元素呈現(xiàn)出差異化,使那些具有完全相同修飾的元素呈現(xiàn)出不同的樣式。比如有些標簽看起來是這樣: <spanclass=“green”></span>而另一些標簽看起來是這樣: <spanclass=“red”></span>網(wǎng)絡(luò)爬蟲可以通過class屬性的值,輕松地區(qū)分出兩種不同的標簽。例如,它們可以用BeautifulSoup抓取網(wǎng)頁上所有紅色的文字,而綠色的文字一個都不抓。因為CSS通過屬性準確地呈現(xiàn)網(wǎng)站的樣式,所以你大可放心,大多數(shù)現(xiàn)代網(wǎng)站上的class和id屬性資源都非常的豐富。BeautifulSoup入場下面讓我們創(chuàng)建一個網(wǎng)絡(luò)爬蟲來抓取/pages/waradpeace.html這個網(wǎng)頁在這個頁面里,小說人物的對話內(nèi)容都是紅色的,人物名稱都是綠色的。你可以看到網(wǎng)頁源代碼里的span標簽引用了對應(yīng)的CSS屬性,如下所示:<spanclass=“red”>Heavens!Whatavirulentattack!</span>replied<spanclass=“green”>theprince</span>,notintheleastdisconcertedbythisreception我們可以先抓取整個頁面,然后創(chuàng)建一個BeautifulSoup對象:fromurllib2importurlopenfrombs4importBeautifulSouphtml=urlopen(‘/pages/page1.html’)bs=BeautifulSoup(html.read(),‘html.parser’)BeautifulSoup入場通過BeautifulSoup對象,我們可以使用find_all函數(shù)提取只包含在<spanclass=“green”></span>標簽里的文字,這樣就會得到一個人物名稱的python列表(find_all是一個非常靈活的函數(shù),后面會經(jīng)常用到它): nameList=bs.find_all(‘span’,{‘class’:‘green’}) fornameinnameList: print(name.get_text())代碼執(zhí)行以后就會按照《戰(zhàn)爭與和平》中的人物出場順序顯示所有的人名。這是怎么實現(xiàn)的呢?之前我們調(diào)用bs.tagName只能獲取頁面中指定的第一個標簽,現(xiàn)在,調(diào)用bs.find_all(tagName,tagAttributes)可以獲取頁面中所有指定的標簽,不再只是第一個了。獲取人名列表后,程序遍歷列表中所有的名字,然后打印name.get_text(),就可以把標簽中的內(nèi)容分開顯示了。BeautifulSoup入場BeautifulSoup的find()和find_all()可能是你最常用的兩個函數(shù)。借助它們,可以通過標簽的不同屬性輕松過濾HTML頁面,查找需要的標簽組或單個標簽。這兩個函數(shù)非常相似,BeautifulSoup文檔里兩者的定義就是這樣: find_all(tag,attributes,recursive,text,limit,keywords) find(tag,attributes,recursive,text,keywords)很可能你會發(fā)現(xiàn),自己在95%的時間里都只需要使用前兩個參數(shù):tag和attributes。但是,我們還是應(yīng)該仔細地看看所有的參數(shù)。標簽參數(shù)tag,可以傳遞一個標簽的名稱或多個標簽名稱組成的Python列表做標簽參數(shù)。例如,下面的代碼將返回一個包含HTML文檔中所有標題標簽的列表: .find_all([‘h1’,‘h2’,‘h3’,‘h4’,‘h5’,‘h6’])屬性參數(shù)attributes用一個Python字典封裝一個標簽的若干屬性和對應(yīng)的屬性值。例如,下面的這個函數(shù)會返回HTML文檔里紅色與綠色的兩種顏色的span標簽: .find_all(‘span’,{‘class’:{‘green’,‘red’}})BeautifulSoup的find()和find_all()遞歸參數(shù)recursive是一個布爾變量。你想抓取HTML文檔標簽結(jié)構(gòu)里多少層的信息?如果recursive設(shè)置為True,find_all就回根據(jù)你的要求去查找標簽參數(shù)的所有子標簽,以及子標簽的子標簽。如果recursive設(shè)置為False,find_all就只查找文檔的一級標簽。find_all默認是支持遞歸查找的(recursive默認值是True);一般情況下這個參數(shù)不需要設(shè)置,除非你真正了解自己需要哪些信息,而且抓取的速度非常重要,那時你可以設(shè)置遞歸參數(shù)。文本參數(shù)text有點不同,它是用標簽的文本內(nèi)容去匹配,而不是用標簽的屬性。假如我們想查找前面網(wǎng)頁中包含“theprince”內(nèi)容的標簽數(shù)量,可以把之前的find_all方法換成下面的代碼: nameList=bs.find_all(text=‘theprince’) print(len(nameList))輸出結(jié)果為“7”BeautifulSoup的find()和find_all()范圍限制參數(shù)limit顯然只用于find_all方法.find其實等價于limit等于1時defind_all。如果你想獲取網(wǎng)頁中的前X項結(jié)果,就可以設(shè)置它。但是要注意,設(shè)置這個參數(shù)之后,獲得的前幾項結(jié)果是按照網(wǎng)頁上的順序排序的,未必是能想要的那前幾項。還有一個關(guān)鍵詞參數(shù)keyword,可以讓你選擇那些具有指定屬性的標簽。例如: title=bs.find_all(id=‘title’,class_=‘text’)上述代碼返回第一個在class_屬性中包含單詞text并且在id屬性中包含title的標簽。需要注意的是,通常情況下,頁面中每個id的屬性值只能被使用一次。因此在實際情況中,上面的代碼可能并不實用,而以下代碼可以達到同樣的效果: title=bs.find(id=‘title’)講到這里,可能會捫心自問:是不是已經(jīng)知道如何用標簽屬性獲取一組標簽了?用字典把屬性傳到函數(shù)里就行了?回憶前面內(nèi)容,通過標簽參數(shù)tag把標簽列表傳到.find_all()里獲取一組標簽,其實就是一個“或”關(guān)系的過濾器(即選擇所有帶標簽1、標簽2或標簽3……的標簽)。如果標簽列表很長,就需要花費很長時間才能寫完。而關(guān)鍵詞參數(shù)keyword可以讓你增加一個“與”關(guān)系的過濾器來簡化工作。BeautifulSoup的find()和find_all()BeautifulSoup對象:
前面代碼中的bs標簽Tag對象: BeautifulSoup對象通過find和find_all,或者直接調(diào)用子標簽獲取的一列對象或單個對象,就像: bs.div.h1但是這個庫還有另外兩種對象,雖然不常用,卻應(yīng)該了解一下。NavigableString對象:
用來表示標簽里的文字,而不是標簽本身(有些函數(shù)可以操作和生成NavigableString對象,而不是標簽對象)Comment對象:
用來查找HTML文檔的注釋標簽,<!--像這樣-->。這四個對象是用BeautifulSoup庫時會遇到的所有對象。BeautifulSoup對象正則表達式語法PART03字符串中提供的find、rfind等方法可以實現(xiàn)字符串的精確匹配,即在一個字符串中查找另一個字符串出現(xiàn)的位置。而通過正則表達式可以定義一些匹配規(guī)則,只要滿足匹配規(guī)則即認為匹配成功,從而實現(xiàn)模糊匹配。正則表達式中既可以包含普通字符,也可以包含由特殊字符指定的匹配模式。在實際應(yīng)用正則表達式進行匹配時,正則表達式中的普通字符需要做精確匹配,而特殊字符指定的匹配模式則對應(yīng)了用于模糊匹配的規(guī)則?;A(chǔ)語法占位符描述.(點)匹配換行外的任一字符。例如,對于正則表達式“ab.c”,其與“abdc”和“ab1c”匹配,但與“acdb”、“abc”和“ab12c”不匹配。^(插入符)匹配字符串開頭的若干字符。例如,對于正則表達式“^py”,其與“python”匹配,但與“puppy”不匹配。$匹配字符串末尾的若干字符。例如,對于正則表達式“py$”,其與“puppy”匹配,但與“python”不匹配。[]字符集合,對應(yīng)位置可以是該集合中的任一字符。既可以依次指定每一個字符,如[0123456789];也可以通過短橫線“-”指定一個范圍,如[0-9]。在字符序列前加^表示取反,如[^0-9]表示匹配不在0至9之間的字符*匹配前一個模式0次或多次。例如,對于正則表達式“a[0-9]*c”,其與“ac”、“a0c”和“a01c”匹配,但與“abc”不匹配+匹配前一個模式1次或多次。例如,對于正則表達式“a[0-9]+c”,其與“a0c”和“a01c”匹配,但與“ac”和“abc”不匹配?匹配前一個模式0次或1次。例如,對于正則表達式“a[0-9]?c”,其與“ac”和“a0c”匹配,但與“a01c”和“abc”不匹配正則表達式中的部分匹配模式基礎(chǔ)語法占位符描述{m}匹配前一個模式m次。例如,對于正則表達式“a[0-9]{1}c”,其與“a0c”匹配,但與“ac”、“a01c”和“abc”不匹配{m,n}匹配前一個模式m至n次;省略n則匹配前一個模式m次至無限次。例如,對于正則表達式“a[0-9]{1,2}c”,其與“a0c”和“a01c”匹配,但與“ac”和“abc”不匹配|“A|B”表示匹配A或B中的任一模式即可。例如,對于正則表達式“a[b|d]c”,其與“abc”和“adc”匹配,但與“ac”、“aac”和“abbc”不匹配。(…)用()括起來的內(nèi)容表示一個分組。在匹配完成后,可以獲取每個分組在字符串中匹配到的內(nèi)容。例如,對于正則表達式“(.*?)abc”,其與“123abc456abc”匹配結(jié)果為“123”和“456”;而對于正則表達式“(.*)abc”,其與“123abc456abc”匹配結(jié)果為“123abc456”?!??”與“*”的區(qū)別在于:“*?”每次匹配盡可能少的字符;而“*”每次會匹配盡可能多的字符\轉(zhuǎn)義符,使后面一個字符改變原來的含義。例如,在正則表達式中要精確匹配字符$,則需要寫成“\$”;要精確匹配字符^,則需要寫成“\^”正則表達式中的部分匹配模式_續(xù)基礎(chǔ)語法特殊序列描述\numbernumber表示一個數(shù)字,\number用于引用同一編號的分組中的模式(分組編號從1開始)。例如,對于正則表達式“([0-9])abc\1”,其中的“\1”就表示引用第1個分組中的模式“[0-9]”,即等價于“([0-9])abc[0-9]”,匹配以一個數(shù)字開頭、一個數(shù)字結(jié)尾、中間是abc的字符串\A匹配字符串開頭的若干字符,同^\b單詞邊界符,即\b兩邊的字符應(yīng)該一個是非單詞字符、另一個是單詞字符,或者一個是單詞字符、另一個是空字符(即字符串的開頭或末尾)。例如,對于正則表達式“\bfoo\b”,其與“foo”、“foo.”、“(foo)”和“barfoobaz”匹配,但與“foobar”、“foo3”和“foo_bar”不匹配\B非單詞邊界符,與\b功能相反\d匹配任一數(shù)字字符,等價于[0-9]\D與\d作用相反,匹配任一非數(shù)字字符,等價于[^0-9]\s匹配任一空白字符\S與\s作用相反,匹配任一非空白字符\w匹配包含數(shù)字和下劃線在內(nèi)的任一可能出現(xiàn)在單詞中的字符\W與\w作用相反,即匹配\w不匹配的那些特殊字符\Z匹配字符串末尾的若干字符,同表6-2中的$正則表達式中的特殊序列基礎(chǔ)語法Re模塊的使用PART04使用Python提供的re模塊,可以實現(xiàn)基于正則表達式的模糊匹配。re模塊中提供了多個函數(shù),下面分別介紹。使用re模塊中的函數(shù)前,要先通過“importre”導(dǎo)入re模塊。re模塊Re模塊的使用【任務(wù)描述】了解Re模塊的功能與常用操作了解爬蟲【關(guān)鍵步驟】了解Re模塊的功能與常用操作了解爬蟲示例01pile(pattern,flags=0)compile函數(shù)用于將一個字符串形式的正則表達式編譯成一個正則表達式對象,供match、search以及其他一些函數(shù)使用。compile函數(shù)的語法格式為:其中,pattern是一個字符串形式的正則表達式;flags指定了匹配選項,可以使用按位或(|)運算符將多個選項連接起來;flags的默認值為0,表示沒有任何匹配選項。Re模塊的使用示例01compile中flags參數(shù)對應(yīng)的匹配選項匹配選項描述re.A或re.ASCII使\w、\W、\b、\B、\d、\D、\s、\S僅作ASCII碼的匹配,而不是Unicode碼的匹配re.DEBUG顯示被編譯正則表達式的調(diào)試信息re.I或re.IGNORECASE匹配時不區(qū)分大小寫re.L或re.LOCATE使\w、\W、\b、\B和不區(qū)分大小寫的匹配取決于當前的語言環(huán)境(不建議使用)re.M或re.MULTILINE使^能夠匹配每行的開頭若干個字符,$能夠匹配每行的結(jié)尾若干個字符re.S或re.DOTALL使.(點)能夠匹配任一字符(包括換行符)re.X或re.VERBOSE忽略正則表達式中的空格和#后面的注釋Re模塊的使用示例01re.match(pattern,string,flags=0)re模塊中的match函數(shù)用于對字符串開頭的若干字符進行正則表達式的匹配。re.match函數(shù)的語法格式為:其中,pattern是要匹配的正則表達式;string要作正則表達式匹配的字符串;flags參數(shù)的含義與compile函數(shù)中的flags參數(shù)相同。如果匹配成功,則返回一個Match對象;如果匹配失敗,則返回None。Re模塊的使用示例011 importre2 result1=re.match(r'python','Python是一門流行的編程語言',re.I)3 result2=re.match(r'python','我喜歡學(xué)習(xí)Python',re.I)4 result3=re.match(r'python','''我喜歡學(xué)習(xí)Python5 Python是一門流行的編程語言''',re.I|re.M)6 print('result1:',result1)7 print('result2:',result2)8 print('result3:',result3)re.match函數(shù)使用示例result1:<re.Matchobject;span=(0,6),match='Python'>result2:Noneresult3:None程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:Re模塊的使用示例01Pattern.match(string[,pos[,endpos]])除直接調(diào)用re模塊中的match函數(shù)外,也可以使用compile函數(shù)生成的正則表達式對象中的match方法實現(xiàn)同樣功能其中,Pattern是compile函數(shù)返回的正則表達式對象;string是要作正則表達式匹配的字符串;可選參數(shù)pos指定了從string的哪個位置開始進行匹配,默認為0;可選參數(shù)endpos指定了string的結(jié)束位置match函數(shù)將對string中pos至endpos-1范圍的子串進行正則表達式匹配。Re模塊的使用示例011 importre2 pattern=pile(r'python',re.I)#生成正則表達式對象3 result1=pattern.match('Python是一門流行的編程語言')4 result2=pattern.match('我喜歡學(xué)習(xí)Python!',5)5 print('result1:',result1)6 print('result2:',result2)Pattern.match方法使用示例result1:<re.Matchobject;span=(0,6),match='Python'>result2:<re.Matchobject;span=(5,11),match='Python'>程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:Re模塊的使用示例01re.search(pattern,string,flags=0)re模塊中的search函數(shù)對整個字符串進行掃描并返回第一個匹配的結(jié)果。re.search函數(shù)的語法格式為:re.search函數(shù)各參數(shù)的含義與re.match函數(shù)完全相同。如果匹配成功,則返回一個Match對象;否則,返回None。Re模塊的使用示例011 importre2 result1=re.search(r'python','Python是一門流行的編程語言',re.I)3 result2=re.search(r'python','我喜歡學(xué)習(xí)Python!',re.I)4 result3=re.search(r'python','我喜歡學(xué)習(xí)Python,Python簡單易用!',re.I)5 result4=re.search(r'Java','我喜歡學(xué)習(xí)Python!',re.I)6 print('result1:',result1)7 print('result2:',result2)8 print('result3:',result3)9 print('result4:',result4)re.search函數(shù)使用示例result1:<re.Matchobject;span=(0,6),match='Python'>result2:<re.Matchobject;span=(5,11),match='Python'>result3:<re.Matchobject;span=(5,11),match='Python'>result4:None程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:Re模塊的使用示例01Pattern.search(string[,pos[,endpos]])也可使用compile函數(shù)返回的正則表達式對象中的search方法實現(xiàn)re.search函數(shù)同樣功能各參數(shù)含義與Pattern.match方法完全相同。Re模塊的使用示例011 importre2 result1=re.search(r'python','我喜歡學(xué)習(xí)Python!',re.I)3 ifresult1:#判斷是否匹配成功4 print('result1:',result1)#匹配成功則輸出返回的Match對象5 result2=re.match(r'python','我喜歡學(xué)習(xí)Python!',re.I)6 ifresult2:#判斷是否匹配成功7 print('result2:',result2)#匹配成功則輸出返回的Match對象Match對象操作示例1result1:<re.Matchobject;span=(5,11),match='Python'>程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:Re模塊的使用示例01Match對象方法描述group([group1,…])根據(jù)傳入的組號返回對應(yīng)分組的匹配結(jié)果。如果傳入一個組號,則返回一個字符串形式的匹配結(jié)果;如果傳入多個組號,則返回一個由多個匹配結(jié)果字符串組成的元組。如果傳入0,則返回的是與正則表達式匹配的整個字符串groups()返回一個由所有分組的匹配結(jié)果字符串組成的元組start(group=0)返回指定分組的匹配結(jié)果字符串在原字符串中的起始位置;如果group值為0(默認值),則返回與正則表達式匹配的整個字符串在原字符串中的起始位置end(group=0)返回指定分組的匹配結(jié)果字符串在原字符串中的結(jié)束位置;如果group值為0(默認值),則返回與正則表達式匹配的整個字符串在原字符串中的結(jié)束位置Match對象的部分方法Re模塊的使用示例011 importre2 str='''sno:#1810101#,name:#李曉明#,age:#19#,major:#計算機#3 sno:#1810102#,name:#馬紅#,age:#20#,major:#數(shù)學(xué)#'''4 rlt=re.search(r'name:#([\s\S]*?)#[\s\S]*?major:#([\s\S]*?)#',str,re.I)5 ifrlt:#判斷是否有匹配結(jié)果6 print('匹配到的整個字符串:',rlt.group())7 print('name:%s,startpos:%d,endpos:%d'%(rlt.group(1),rlt.start(1),rlt.end(1)))8 print('major:%s,startpos:%d,endpos:%d'%(rlt.group(2),rlt.start(2),rlt.end(2)))9 print('所有分組匹配結(jié)果:',rlt.groups())10 else:11 print('未找到匹配信息')Match對象操作示例2匹配到的整個字符串:name:#李曉明#,age:#19#,major:#計算機#name:李曉明,startpos:20,endpos:23major:計算機,startpos:41,endpos:44所有分組匹配結(jié)果:('李曉明','計算機')程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:Re模塊的使用示例01re.findall(pattern,string,flags=0)re模塊中的findall函數(shù)用于在字符串中找到所有與正則表達式匹配的子串。re.findall函數(shù)的語法格式為:各參數(shù)含義與re.match和re.search函數(shù)完全相同。如果匹配成功,則將匹配的子串以列表的形式返回;如果匹配失敗,則返回空列表。Re模塊的使用示例011 importre2 str='''sno:#1810101#,name:#李曉明#,age:#19#,major:#計算機#3 sno:#1810102#,name:#馬紅#,age:#20#,major:#數(shù)學(xué)#'''4 rlt=re.findall(r'name:#([\s\S]*?)#[\s\S]*?major:#([\s\S]*?)#',str,re.I)5 print(rlt)示例[('李曉明','計算機'),('馬紅','數(shù)學(xué)')]程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:Re模塊的使用示例01re.finditer(pattern,string,flags=0)與re.findall函數(shù)功能唯一區(qū)別在于re.findall函數(shù)返回列表形式的結(jié)果,而re.finditer返回迭代器形式的結(jié)果。各參數(shù)含義與re.findall函數(shù)完全相同。Re模塊的使用示例011 importre2 str='''sno:#1810101#,name:#李曉明#,age:#19#,major:#計算機#3 sno:#1810102#,name:#馬紅#,age:#20#,major:#數(shù)學(xué)#'''4 rlt1=re.finditer(r'name:#([\s\S]*?)#[\s\S]*?major:#([\s\S]*?)#',str,re.I)5 rlt2=re.finditer(r'department:#([\s\S]*?)#',str,re.I)6 print('rlt1:')7 forrinrlt1:8 print(r)9 print('rlt2:')10 forrinrlt2:11 print(r)示例rl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年期銅礦產(chǎn)品購銷協(xié)議版B版
- 2024年度體育用品單位廣告投放合同范本3篇
- 我爸爸課程設(shè)計
- 早教水果蔬菜課程設(shè)計
- 醫(yī)學(xué)電子學(xué)實驗課程設(shè)計
- 中考數(shù)學(xué)二輪復(fù)習(xí)壓軸題培優(yōu)專練專題19 方程思想在壓軸題中的應(yīng)用(原卷版)
- 電子電路課程設(shè)計
- 2024年綠色建筑消防設(shè)施安裝與報驗全權(quán)委托合同3篇
- 2024年農(nóng)業(yè)保險配套農(nóng)田租賃合同范本2篇
- 2024年版國內(nèi)道路貨物承運協(xié)議版B版
- 難免壓力性損傷申報表
- 四線三格word模板
- 國家各部委專項資金申報種類
- 年會抽獎券可編輯模板
- 靜電場知識點例題結(jié)合
- 中醫(yī)醫(yī)案學(xué)三醫(yī)案的類型讀案方法
- 制造業(yè)信息化管理系統(tǒng)架構(gòu)規(guī)劃
- 防雷裝置檢測質(zhì)量管理手冊
- 化學(xué)錨栓計算
- 燃氣鍋爐房和直燃機房防爆問題
- 測井曲線及代碼
評論
0/150
提交評論