1. 程式人生 > >python爬蟲第四天

python爬蟲第四天

let for arc () email nac box style 出現

昨天學到了正則表達式基礎知識 :原子 今天開始學習第二個基礎知識:元字符 元字符 就是正則表達式中含有特殊含義的一些字符 常見的元字符及含義
符號 含義
. 匹配除換行符以外 的任意字符
^ 匹配字符串的開始位置
$ 匹配字符串的結束位置
* 匹配0次,1次,或多次前面的原子
? 匹配0次或一次前面的原子
+ 匹配一次或多次前面的原子
{n} 前面的原子恰好出現n次
{n,} 前面的原子至少出現n次
{n,m} 前面的原子至少出現n次,至多出現m次
| 模式選擇符
() 模式單元符
具體的說,元字符分為: (1)任意匹配元字符(2)邊界限制元字符(3)限定符(4)模式選擇符(5)模式單元符 下面用程序來觀察使用方法 import re string1="abcdfphp345pythony_py"#我們分別讓string1與下面的pattern進行匹配 pattern1=".python..."#.是匹配除了換行符以外的字符 pattern2="^abd" pattern3="^abc" pattern4="py$" pattern5="ay$" pattern6="py.*n" pattern7="cd{2}" pattern8="cd{3,}" pattern9="python|php"#可以把|當成‘或’理解 pattern10="(cd){1,}"#小括號裏會被當成一個整體使用,這裏的意思是cd會至少出現一次 pattern11="cd{1,}"#這裏就是d會至少出現一次 print(re.search(pattern1,string1)) print(re.search(pattern2,string1)) print(re.search(pattern3,string1)) print(re.search(pattern4,string1)) print(re.search(pattern5,string1)) print(re.search(pattern6,string1)) print(re.search(pattern7,string1)) print(re.search(pattern8,string1)) print(re.search(pattern9,string1)) print(re.search(pattern10,string1)) print(re.search(pattern11,string1)) #結果: #<_sre.SRE_Match object; span=(10, 20), match=‘5pythony_p‘> #None #<_sre.SRE_Match object; span=(0, 3), match=‘abc‘> #<_sre.SRE_Match object; span=(19, 21), match=‘py‘> #None #<_sre.SRE_Match object; span=(11, 17), match=‘python‘> #None #None #<_sre.SRE_Match object; span=(5, 8), match=‘php‘> #<_sre.SRE_Match object; span=(2, 4), match=‘cd‘> #<_sre.SRE_Match object; span=(2, 4), match=‘cd‘> 模式修正
模式修正符就是在不改變正則表達式的情況下通過模式修正符改變正則表達式的含義 常見如下
符號 含義
I 匹配時忽略大小寫
M 多行匹配
L 做本地化識別
U 根據Unicode字符及解析字符
S 讓.匹配包括換行符,使用後.就可以匹配任意字符了
通過re.search(pattern1,string,re.I)修改即可 貪婪模式與懶惰模式 貪婪模式核心就是盡可能多的匹配,懶惰模式就是盡可能少的匹配。
pattern1="p.*y"#貪婪模式 pattern2="p.*?y"#懶惰模式,采用的就是就近匹配原則 print(re.search(pattern1,string1)) print(re.search(pattern2,string1)) #結果 #<_sre.SRE_Match object; span=(5, 21), match=‘php345pythony_py‘> #<_sre.SRE_Match object; span=(5, 13), match=‘php345py‘> 如果我們想在字符間匹配任意字符,如“p.*y”默認是懶惰模式,通常在對應的.*後面加上?就可以從貪婪模式轉為懶惰模式 正則表達式常見函數 直接用代碼理解 import re string="dpythonhbaigdukpythonabvjsvawegadbkvj" pattern =".python." print(re.match(pattern,string)) #會從string起始位置(開頭)開始匹配,不滿足返回None,滿足則返回匹配結果 #後面的不會匹配到 print(re.match(pattern,string).span())#會輸出匹配結果在源字符串的位置 print(re.search(pattern,string))#會查找整個字符串得到匹配結果 上述每次只能匹配一個內容 如何將符合模式的內容全部匹配出來? 1:使用re.compile()對正則表達式進行預編譯。 2:編譯後,使用findall()根據正則表達式從源字符中將匹配內容全部找出 #pattern1=re.compile(".python.") #print(pattern1.findall(string)) print(re.compile(pattern).findall(string)) 如果想替換字符串可以使用re.sub()方法 格式:re.sub(pattern 正則表達式,rep要替換的字符,string源字符串,max最多替換次數) re.sub(pattern."php",string,2) 常用實例 匹配.com或.cn的後綴URL pattern="[a-zA-Z]+://[^\s]*[.com|.cn]" string="<a href=‘http://www.baidu.com‘>百度首頁</a>" result=re.search(pattern,string) print(result) 匹配電話號碼: patternphone="\d{4}-\d{7}|\d{3}-\d{8}" 匹配電子郵件 patternemail="\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*" 正則就到這,明天開始學習cookie相關知識

 此文是我在學習《精通Python網絡爬蟲》(韋瑋著)的總結,純手打。

python爬蟲第四天