常見匹配模式:
re.match嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功,則match()返回none
re.match(pattern,string,flags=0)
最常規的匹配
import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu\s\d\d\d\s\d\s\w.*e$',content)
>>> result
<_sre.sre_match object span="(0," match="lu 156 156 shuai_ ke">
# 我們來看,這返回的物件是什麼
>>> print(result.span()) # 長度範圍
(0, 20)
>>> print(len(content))
20>>> print(result.group()) # 返回匹配結果
lu 156 156 shuai_ ke
範匹配
>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu.*ke$',content) # 貪婪匹配,盡可能多的匹配
>>> result
<_sre.sre_match object span="(0," match="lu 156 156 shuai_ ke">
>>> result.group()
'lu 156 156 shuai_ ke'
>>> result.span()
(0, 20)
匹配目標
>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu\s(\d+)\s(\d+).*ke$',content)
>>> result
<_sre.sre_match object span="(0," match="lu 156 156 shuai_ ke">
>>> result.group(1) # 輸出第乙個括號匹配的內容
'156'
>>> result.group(2) # 輸出第乙個括號匹配的內容
'156'
貪婪匹配
>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu.*(\d+).*ke$',content)
>>> result.group()
'lu 156 156 shuai_ ke'
>>> result.group(1)
'6'# 執行結果只匹配到了乙個字元6,前面的1,5全被.*匹配到了
# 這就是前面說的,貪婪模式,盡可能多的匹配
# re.match('^lu.*(\d+).*ke$',content)這個正則有一項(\d+),也就是說最少得匹配乙個數字
非貪婪模式匹配
>>> import re
>>> content = 'lu 156 156 shuai_ ke'
>>> result = re.match('^lu.*?(\d+).*ke$',content)
>>> result
<_sre.sre_match object span="(0," match="lu 156 156 shuai_ ke">
>>> result.group(1)
'156'
# 這個?會指定為非貪婪模式匹配,匹配盡可能少的字元
# ?後有個(\d+),也就是當看到後面出現了數字就會把停止前面的匹配
匹配模式
import re
content = 'lu 156 156 shuai_ ke
is a good boy'
result = re.match('^lu.*?(\d+).*?boy$',content)
print(result)
none
# .匹配除換行符以外任意字元
result = re.match('^lu.*?(\d+).*?boy$',content,re.s)
轉義
>>> import re
>>> content = 'price is $5.00'
>>> result = re.match('price is $5.00',content)
>>> result
>>> result = re.match('price is \$5\.00',content)
>>> result
<_sre.sre_match object span="(0," match="price is $5.00">
# \ 轉義符
總結:盡可能使用範匹配模式
使用括號得到匹配目標
盡量使用非貪婪模式,有換行符就用re.s
re.search
re.search掃瞄整個字元並返回第乙個成功的匹配
>>> import re
>>> content = 'rioxa 2549 xwth_ppj'
>>> result = re.match('r.*?(\d+).*?j$',content)
>>> result
<_sre.sre_match object span="(0," match="rioxa 2549 xwth_ppj">
>>> result = re.match('i.*?(\d+).*?j$',content)
>>> result
>>>
# re.match如果第乙個字元是不匹配的,那麼就不能正常進行匹配
>>> result = re.search('i.*?(\d+).*?j$',content)
>>> result
<_sre.sre_match object span="(1," match="ioxa 2549 xwth_ppj">
練習:為了對新人視感友好,我將這段html進行了進行了簡化,提取感興趣的內容
import re
content = '\n \
\n\'result = re.search('(.*?)(.*?)',content,re.s)
print(result.group(1),result.group(2),result.group(3))
re.findall搜尋字串,以列表形式返回全部匹配到的字元
還是用上面的例子
result = re.findall('(.*?)(.*?)',content,re.s)
print(result) # 發現有個問題,在html中存在很多換行符或空格
for res in result:
res[1].split()
res[2].split()
res[0].split()
re.sub替換字串中每乙個匹配的子串後,返回替換的字串
import re
content = 'lu 156 156 shuai_ ke'
result = re.sub('\d+', 'number', content)
print(result)
# lu number number shuai_ ke
result = re.sub('(\d+)', r'\1 651', content)
print(result)
# lu 156 651 156 651 shuai_ ke
re.compile將正則字串編譯成正規表示式物件
import re
content = 'fdfsdf 2342 sfsdg \n \
sdfdf sfdo'
pattern = re.compile('fd.*?do', re.s)
result = re.match(pattern, content)
print(result)
# 減少**復用
爬爬爬,爬蟲之獲取資料 requests
推薦使用requests庫,相比urllib使用要簡介的多 requests向目標站點傳送請求,獲得乙個httpresponse響應 import requests requests.get requests.post requests.put requests.delete requests.he...
爬蟲學習 Requests 正規表示式爬取貓眼電影
p14 requests 正規表示式import requests from requests.exceptions import requestexception def get one page url try headers response requests.get url,headers ...
Python爬蟲 用正規表示式爬取小說內容
import requests import re import json from requests.exceptions import requestexception defget one page url try headers 設定 伺服器 response requests.get ur...