Python程序設計基礎 (第3版) 課件【ch10】正則表達式與簡單爬蟲_第1頁
Python程序設計基礎 (第3版) 課件【ch10】正則表達式與簡單爬蟲_第2頁
Python程序設計基礎 (第3版) 課件【ch10】正則表達式與簡單爬蟲_第3頁
Python程序設計基礎 (第3版) 課件【ch10】正則表達式與簡單爬蟲_第4頁
Python程序設計基礎 (第3版) 課件【ch10】正則表達式與簡單爬蟲_第5頁
已閱讀5頁,還剩33頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第十章正則表達式與簡單爬蟲高等學校計算機類特別教材上海市高等學校信息技術水平考試參考教材Python程序設計基礎理解正則表達式的基本語法規則。本章教學目標學會用re庫的內置函數進行匹配、搜索、分組、替換等字符串操作。了解和體驗用簡單爬蟲自動獲取網頁資源的方法。01正則表達式PARTONE10.1正則表達式正則表達式(regularexpression)是由一些特定字符及其組合所組成的字符串表達式,用來對目標字符串進行過濾操作。目前,大部分操作系統(Linux、UNIX、Windows等)和程序設計語言(Java、C++、C#、Python、JavaScript等)均支持正則表達式的應用。hon程序可利用多種方法實現對圖形和圖像的呈現與處理。本章要介紹利用Python3.x版自帶的tkinter庫的Canvas、tutle庫以及第三方的matpotib庫進行圖形繪制的常用方法。對于一些有規律的字符串,例如,手機號碼、身份證號、網址、生物信息編碼等,無法用簡單的判斷表達其組成規律,而用正則表達式則可簡便、準確、高效地進行表達和匹配操作。在正則表達式中,常見的基本符號見表10-1。10.1正則表達式正則表達式用這些基本符號,以單個字符、字符集合、字符范圍、字符之間的組合等

形式組成模板,然后用這個模板與所搜索的字符串進行匹配。10.1正則表達式10.1.1正則表達式的構成1字符匹配(1)數字和構詞字符。用"d可以匹配一個數字,用'w可以匹配一個構詞字符(包括數字)。例如::(2)任意單個字符。用!可以匹配任意單個字符,例如,py:可以匹配py2'、py3'、py!等。(3)字符取值限定范圍。用「…J表示字符取值限定范圍,一組方括號只能表示一個字符,例如,”[0-9a-zA-Z\]可匹配一個數字、字母或下畫線。因為Pp可匹配P或p,所以[Piplython'可匹配'Python'或python'。(4)開頭和結尾。用心表示匹配字符串的開頭,用'^d'表示必須以數字開頭,用'$表示匹配字符串的結尾,用'ds'表示必須以數字結束。例如,py可以匹配'python',但加上表示開頭和結尾的符號后,‘pyS'只能匹配整個目標字符串,即'py,對于python'則不能匹配了。(5)空白字符。換行符^m'、回車符'r'、制表符^等控制字符可統一用空白字符^s‘表達。為避免與語法表達式中的符號混淆,要用轉義或加r前綴統一轉義。建議使用r前綴,其后就可以不用考慮轉義符的問題了。(6)漢字。Python默認支持UTF-8編碼,可以直接用漢字精確匹配。10.1.1正則表達式的構成2重復數量在字符匹配表達式之后,可用^*表示任意次重復(包括0次),用‘+表示至少1次重復,用?'表示0次或1次重復,用'{n}'表示固定n次重復,用'{n,m}'表示n~m次重復。例如,在正則表達式d{3}1s+ld{5,8}'中,^d{3}'匹配3位數字,^s"匹配1個空白符號,而's+表示至少有1個空格(包括制表符),'\d{5,8}'表示5~8位數字。這樣,該正則表達式可匹配帶3位區號并以任意個空格隔開的5~8位電話號碼。又如,常見的用'-隔開區號的電話號碼,國內長途區號為3~4位數字,如北京市為010、江蘇省蘇州市為0512等,固定電話號碼為5~8位數字,中間用連字符連接,可用正則表達式'd{3,4}\-1d{5,8}'或rd{3,4}-d{5,8}'匹配。10.1.1正則表達式的構成3分組匹配將一個復雜的匹配規律拆分成多個子表達式,再用圓括號將多個子表達式組合起來可進行分組匹配。例如,帶1或2位小數的數字可表達為([1-9][0-9]*)(.[0-9]{1,2})。對于稍復雜一些的字符串,如IPv4的IP地址由4組點分隔的十進制數組成,每組數字不能超過255,頭、尾不能是0或255??勺鋈缦虏鸱郑?0.1.1正則表達式的構成10.1.1正則表達式的構成10.1.2貪婪匹配模式與非貪婪匹配模式利用正則表達式將字符串的匹配模式通常分為貪婪匹配模式和非貪婪匹配模式兩種。貪婪匹配模式是正則表達式默認的匹配模式。貪婪匹配模式是一種趨向于最大長度的匹配模式,即盡可能多地匹配字符。例'

ab+c'可匹配'abc'、'abbbc、'abbbbbc'、'abbbbbbbbbbbbc'等,而默認的貪婪

匹配模式會匹配最長的'abbbbbbbbbbbbc'。在實際應用中,有時并不是匹配得越多越好,需要按實際需求將默認的貪婪匹配模式轉變為精確匹配模式,即為非貪婪匹配模式。某人寫出正則表達式^(d+)(0*)S'用來匹配以若干個0結尾的數字字符串,但其對'123456照樣可以匹配,因為默認的貪婪匹配模式直接把后面的0作為數字全部匹配了,實際上該表達式等效于'^(d+)S。當需要對必須以任意數字開頭和4個0結尾的數字字符串(例210如1230000')進行匹配時,建議采用非貪婪匹配模式正則表達式'^(d+?)(0{4})S’,這樣能精確地把后面的4個0全部匹配出來。在正則表達式中表示重復數量的符號后面加“?”可將匹配模式從貪婪匹配模式轉變為非貪婪匹配模式,即盡可能減少重復匹配。例如,'{m,}?'表示對前面的字符重復匹配m~n次,并且盡可能少重復。在'ab+?c'可匹配的字符串中會匹配最短的'abc'。10.1.1正則表達式的構成02re庫的內置函數PARTTWO10.2re庫的內置函數Python處理正則表達式的標準庫是re。使用re庫的一般步驟:首先用importre語句導入,然后用pile()方法將正則表達式實例化,創建正則表達式對象,再利用re庫提供的內置函數對字符串進行匹配、搜索、替換、切分和分組等操作。pile()方法通常包括參數patterm(正則表達式)和flag(匹配模式,可選)。

flag的常見取值說明如下。

re.I:忽略大小寫。

reL:使用當前本地化語言字符集中定義的\w、IW、b、IB、Is、IS(用于多語言操作系統)。re.M:多行模式,使^和$作用于每行的開始和結尾。re.S:用''所匹配的任意字符,包括換行符。re.U:使用Unicode字符集中定義的\w、IW、lb、\B、ls、IS、\d、ID。re.X:忽略空格,并允許用#添加注釋。例如,創建正則表達式實例化對象p:10.2re庫的內置函數10.2.1匹配與搜索實現匹配與搜索的方法有match()、search()和fndall()。它們的作用和用法相似,通常有以下兩種使用方法。①作為正則表達式實例化對象p的方法使用:若非指定,則pos和endpos的默認值分別為0和len(string),即從頭到尾。②不預先實例化正則表達式而直接調用:

上述方法若沒有匹配成功,均返回None。不同的是,match()方法用于從起始位置匹配,而search()方法用于搜索整個字符串的所有匹配。若匹配成功,則用span()方法返回表示匹配起始和終止位置的元組,findall()方法則以列表形式返回全部能匹配的子串。例如:10.2.1匹配與搜索10.2.1匹配與搜索【例10-1】某E-mail地址的構成規則:英文字母或數字(1~10個字符)+“@”+英文字母或數字(1~10個字符)+“.”,最后以com或org結束。其正則表達式為'[a-ZA-Z0-9]{1,10}@[a-zA-Z0-9]{1,10}.(comjorg)$”。輸入E-mail地址的測試字符串,忽略大小寫,判斷并輸出是否符合構成規則。10.2.1匹配與搜索10.2.1匹配與搜索10.2.2

切分與分組1切分在實際應用中,常遇到來自不同數據源用不同分隔符號隔開的字符數據,分隔符號可能是一個或多個空格、制表符、英文逗號、英文分號等,利用正則表達式和split()方法可方便地將其切分,并以字符串列表返回結果。語法格式如下::其中,除前面已出現的pattern和string外,可選參數maxsplit為最大切分次數。例如,分隔符號是一個或多個空格、制表符、英文逗號、英文分號的正則表達式為10.2.2

切分與分組2分組當正則表達式是由多個括號組合而成的復合形式時,用group()方法,可對用re.match()或re.search()方法成功匹配的返回對象按正則表達式的分組提取子串。例如,表示電話號碼的正則表達式^(d{3,5})-(d{5,83)$'由區號和本地號碼兩個分組組成,用group()可以直接從匹配的字符串中提取出區號和本地號碼:10.2.2

切分與分組10.2.3

換用re庫中的sub()和subn()方法,可將正則表達式所匹配的字符串內容替換為指定字符

串內容,并返回替換后的新字符串。兩者用法一樣,只是sub()方法返回的是替換后

的新字符串,而subn()則以元組類型返回新字符串和替換次數。語法格式如下:其中,repl為擬替換的字符串?!纠?0-2】用正則表達式將字符串s中連續的3位數字替換為^xxX’。10.2.3

換03正則表達式的應用:簡單爬蟲PARTTHREE10.3正則表達式的應用:簡單爬蟲網絡爬蟲是指按照一定規則自動抓取網絡信息的程序或腳本。運用Python內置的requests或urllib等類庫并結合正則表達式,可簡單實現對靜態網頁信息的自動下載。爬蟲程序的基本步驟如下:●獲取網頁源代碼;●根據所關注目標所在鏈接的特點寫出正則表達式;●用正則表達式匹配獲取目標鏈接;●用循環結構遍歷目標鏈接并自動下載信息。下面以自動抓取靜態網頁中的新聞鏈接、標題和新聞圖片信息為例,用Python編程實現。10.3.1抓取新聞鏈接和標題用瀏覽器訪問某網頁時,在網頁上右擊,從快捷菜單中選擇“查看源代碼”命令,可以看到網頁的源代碼,如圖10-1所示?!纠?0-3】自動抓取《人民日報》的網上信息發布平臺人民網

(htp:/)首頁中的新聞鏈接和標題,并將結果寫入C:data\a.csv中。用requests.get(url,headers)可獲取以字符串類型呈現的上述網頁的源代碼。有些網站設置了反爬機制,要求提供瀏覽器的請求標頭才能得到網頁源代碼。程序中可仿冒瀏覽器的請求標頭建立以User-Agent為鍵的字典為headers提供參數。以Edge瀏覽器為例,找到“開發人員選項”菜單,在“網絡”/“請求標頭”中可復制該瀏覽器的請求標頭,從而建立字典head。```由于該網頁以簡體中文編碼,因此要將該字符串的編碼方式設定為html.encoding='GBK'(其他網頁中采用的編碼方式也可能是'UTF-8'),以免出現亂碼。在編寫程序過程中,隨時可通過print()函數觀察效果:10.3.1抓取新聞鏈接和標題根據該鏈接和標題的源代碼特點,以非貪婪匹配模式“.*?”替代具體鏈接和標題內容作為正則表達式:如果正則表達式中含有單引號和雙引號,用Python特有的三引號更能表現出優勢。實例化正則表達式對象為titre,用findall()方法可得到匹配正則表達式的具有字符串類型元素的列表urls。10.3.1抓取新聞鏈接和標題用循環結構遍歷列表urls,以鏈接和標題之間固定的字符串“target=_blank>”作為分隔,用re.split()方法可將鏈接與標題分為列表spli中的兩個字符串類型元素。將兩個字符串切片、打印,并寫入文件C:(data\a.csv中(.csv文件的編碼方式為'GBK'),即可得到結果,如圖10-2所示。10.3.1抓取新聞鏈接和標題10.3.1抓取新聞鏈接和標題10.3.2

抓取新聞圖片素材【例10-4】自動抓取人民網(htp:/cn)首頁中的新聞圖片,自動編號后保存在C:1data\文件夾中。用requests.get(url,headers)獲取以字符串類型呈現的網頁源代碼,可見其中jpg類型的圖片很多,我們所關注的新聞圖片鏈接的呈現特點如下:實例化正則表達式對象為imgre,用findall()方法可得到匹配正則表達式的具有字符串類型元素的列表urls。在注釋處可通過print()語句觀察效果。用循環結構遍歷列表urls,并將保存圖片鏈接的字符串imgu切片,前面加上首頁鏈接url,即為完整的圖片鏈接。調試時可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論