python爬蟲學習第五章正則
正則表達式與Cookie的使用
正則表達式基礎知識
- 原子
原子是正則表達式中最基本的組成單位,每個正則表達式中至少要包含一個原子,常見的原子有以下幾類:- 普通字符作為原子
- 非打印字符作為原子
- 通用字符作為原子
- 院子表
- 普通字符作原子的情況。普通字符比如數字、大小寫字母、下劃線等都可以作為原子使用。比如如下程序中,我們就使用了“yue"作為原子使用,分別是‘y‘‘u‘‘e‘。
import re
pattern="yue"
string="http://yum.iqianyue.com"
result1=re.search(pattern,string)
print(result1) - 非打印字符作為原子
所謂的非打印字符,指的是一些在字符串中用於格式控制的符號,比如換行符等。import re
pattern="\n"
string="http://yum.iqianyue.com
http://baidu.com"
result1=re.search(pattern.string)
print(result1) - 通用字符作為原子
所謂通用字符,即一個原子可以匹配一類字符,我們在實際項目中經常會用到這一類原子。
| 符號 | 含義|| \w | 匹配任意一個字母、數字或下劃線 |
| \W | 匹配除了字母、數字和下劃線以外的任意字符|
| \d | 匹配任意一個十進制數|
| \D | 匹配除了十進制數以外的任意一個其他字符 |
| \s | 匹配任意一個空白字符 |
| \S | 匹配除空白字符以外的任意一個其他字符 |import re
pattern="\w\dpython\w"
string="abcdfphp345python_py"
result1=re.search(pattern,string)
print(result1) - 原子表
定義一組地位平等的原子,然後匹配的時候會取該原子表中的任意一個原子匹配,在Python中,原子表有[]表示比如[xyz]就是一個原子表,這個原子表中定義了3個原子,這3個原子的地位平等,如,我們定義的正則表達式為“[xyz]py”,對應的原字符串是"xpython",如果此時使用re.search()函數進行匹配,就可以匹配出結果"xpy",因為此時只要py前一位是x y z字母中的其中一個字母,就可以匹配成功。
類似的,[^]代表的是除了中括號裏面的原子均可以匹配,比如"[^xyz]py"能匹配"apy",但是卻不能匹配"xpy"等。import re
pattern1="\w\dpython[xyz]\w"
pattern2="\w\dpython[^xyz]\w"
pattern3="\w\dpython[xyz]\W"
string="abcdfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
result3=re.search(pattern3,string)
print(result1)
print(result2)
print(result3)
- 元字符
所謂元字符,就是正則表達式中具有一些特殊含義的字符,比如重復N次前面的字符等。 | 符號 | 含義 |
| . | 匹配除換行符以外的任意字符 |
| ^ | 匹配字符串的開始位置 |
| $ | 匹配字符串的結束位置 |
| * | 匹配0次、1次或多次前面的原子 |
| ? | 匹配0次或1次前面的院子 |
| + | 匹配1次或多次前面的原子 |
| {n} | 前面的院子恰好出現n次 |
| {n,} | 前面的原子至少出現n次 |
| {n,m} | 前面的原子至少出現n次,至多出現m次 |
| ‘|‘ | 模式選擇符 |
| () | 模式單元符 |
具體來說元字符可以分為:任意匹配元字符、邊界限制元字符、限定符、模式選擇符、模式單元等。 <<<<<<< HEAD- 任意匹配元字符
首先講解任意匹配元字符 “.”,我們可以使用"."匹配一個除換行符以外的任意字符。比如,我們可以使用正則表達式".python..."匹配一個"python"字符前1位,後面有3位的格式的字符,這裏的前一位和後面的3位可以是除了換行符以外的任意字符。import re pattern=".python..."string="abcdfphp345pythony_py"result1=re.search(pattern,string)print(result1)
- 邊界限制元字符
可以使用"^"匹配字符串的開始,使用"$"匹配字符串的結束import re
pattern1="^abd"
pattern2="^abc"
pattern3="py$"
pattern4="ay$"
string="abcdfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
result3=re.search(pattern3,string)
result4=re.search(pattern4,string)
print(result1)
print(result2)
print(result3)
print(result4) - 限定符
常見的限定符包括*、?、+、{n}、{n,}、{n,m}.import re
pattern1="py.*n"
pattern2="cd{2}"
pattern3="cd{3}"
pattern4="cd{2,}"
string="abcdddfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
result3=re.search(pattern3,string)
result4=re.search(pattern4,string)
print(result1)
print(result2)
print(result3)
print(result4) - 模式選擇符
模式選擇符“|”,可以設置多個模式,匹配時,可以從中選擇任意一個模式匹配。比如正則表達式“python|php”中,字符串“python”和"php"均滿足匹配條件。import re
pattern="python|php"
string="abcdfphp345pythony_py"
result1=re.search(pattern,string)
print(result1) - 模式單元符
模式單元符"()",可以將一些原子組合成一個大原子,小括號括起來的部分作為一個整體去使用。import re
pattern1="(cd){1,}"
pattern2="cd{1,}"
string="abcdcdcdcdfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
print(result1)
print(result2)
- 任意匹配元字符
- 模式修正
所謂模式修正符,即可以在不改變正則表達式的情況下,通過模式修正符改變正則表達式的含義,從而實現一些匹配結果的調整等功能。比如,可以使用模式修正符I讓對於模塊在匹配時不區分大小寫。
| 符號 | 含義 || I | 匹配時忽略大小寫 |
| M | 多行匹配 |
| L | 做本地化識別匹配 |
| U | 根據Unicode字符及解析字符 |
| S | 讓.匹配包括換行符,即用了該模塊修正後,"."匹配就可以匹配任意的字符了|import re
pattern1="python"
pattern2="python"
string="abcdfphp34Pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string,re.I)
print(result1)
print(result2) - 貪婪模式與懶惰模式
貪婪模式的核心點就是盡可能多地匹配,而懶惰模式的核心點就是盡可能少的匹配。import re
pattern1="p.*y"#貪婪模式
pattern2="p.*?y"#懶惰模式
string="abcdfphp345pythony_py"
result1=re.search(pattern1,string)
result2=re.search(pattern2,string)
print(result1)
print(result2)
正則表達式常見函數
- re.match()函數
如果想要從起始位置匹配一個模式,可以使用re.match()函數,格式re.match(pattern,string,flag)
第一個參數為正則表達式,第二個參數源字符串,第三個是可選參數,代表標誌位。import re
string="apythonhellomypythonhispythonourpythonend"
pattern=".python."
result=re.match(pattern,string)
result2=re.match(pattern,string).span()
print(result)
print(result2) - re.search()函數
re.search()函數會在全文中進行檢索並匹配.import re
string="hellomypythonhispythonourpythonend"
pattern=".python."
result=re.match(pattern,string)
result2=re.search(pattern,string)
print(result)
print(result2) - 全局匹配函數
匹配一串字符串中多個結果。- 使用re.compile()對正則表達式進行預編譯.
- 編譯後,使用findall()根據正則表達式從源字符串中將匹配的結果全部找出。 、
import re
string="hellomypythonhispythonourpythonend"
pattern=re.compile(".python.")#預編譯
result=pattern.findall(string)#找出符合模式的所有結果
print(result)import re
string="hellomypythonhistpythonourpythonend"
pattern=".python."
result=re.compile(pattern).findall(string)
print(result)
- re.sub函數
使用正則表達式替換某些字符串功能,可以使用re.sub()函數實現。re.sub(pattern,rep,string,max)
第一個參數為正則表達式,第二個參數為要替換成的字符串,第三個參數為源字符串,第四個參數為可選項,代表最多替換的次數,不寫的話,就全部替換。import re
string="hellomypytonhispythonourpythonend"
pattern="python."
result1=re.sub(pattern,"php",string)#全部替換
result2=re.sub(pattern,"php",string,2)#最多替換兩次
print(result1)
print(result2)
常見實例解析
- 匹配.com或.cn後綴的URL網址
import re
pattern="[a-zA-Z]+://[^\s]*[.com|.cn]"
string="<a href=‘http://www.baidu.com‘>百度首頁</a>"
result=re.search(pattern,string)
print(result) - 匹配電話號碼
import re
pattern="\d{4}-\d{7}|\d{3}-\d{8}"匹配電話號碼的正則表達式
string="0216728263682382265236"
result=re.search(pattern,string)
print(result) - 匹配電子郵件地址
import re
pattern="\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*"#匹配電子郵箱的正則表達式
string="<a href=‘http://www.baidu.com‘>百度首頁</a><br><a href=‘mailto:[email protected]‘>電子郵箱地址</a>"
result=re.search(pattern,string)
print(result)
什麽是Cookie
Http是一個無狀態協議,即無法維持會話之間的狀態。Cookie可以保存狀態。
Cookiejar實戰
import urllib.request
import urllib.parse
import http.cookiejar
url="post請求地址"
postdata=urllib.parse.urlencode({
"username":"用戶名"
"password":"密碼"
}).encode("utf-8")
req=urllib.request.Request(url,postdata)
req.add_header(‘User-Agent‘,‘User-Agent的值‘)
cjar=http.cookieJar.CookieJar() #使用http.cookiejar.CookieJar()創建CookieJar對象
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))#使用HTTPCookieProcessor創建cookie處理器,並以其為參數構建opener對象
urllib.request.install_opener(opener) #將opener安裝為全局
file=opener.open(req)
data=file.read()
file=open("文件存儲地址","wb")
file.write(data)
file.close()
url2="網頁地址"
data2=urllib.request.urlopen(url2).read()
fh=open("文件地址",‘wb‘)
fh.write(data2)
fh.close()
=======
3f577ee4216aa3d991983f31467a7d7578dd9797
python爬蟲學習第五章正則