您好,登錄后才能下訂單哦!
1.正則表達(dá)式 re
典型的搜索和替換操作要求您提供與預(yù)期的搜索結(jié)果匹配的確切文本。雖然這種技術(shù)對(duì)于對(duì)靜態(tài)文本執(zhí)行簡(jiǎn)單搜索和替換任務(wù)可能已經(jīng)足夠了,但它缺乏靈活性,若采用這種方法搜索動(dòng)態(tài)文本,即使不是不可能,至少也會(huì)變得很困難。
通過使用正則表達(dá)式,可以:
- 測(cè)試字符串內(nèi)的模式。
例如,可以測(cè)試輸入字符串,以查看字符串內(nèi)是否出現(xiàn)電話號(hào)碼模式或信用卡號(hào)碼模式。這稱為數(shù)據(jù)驗(yàn)證。
- 替換文本。
可以使用正則表達(dá)式來識(shí)別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。
- 基于模式匹配從字符串中提取子字符串。
可以查找文檔內(nèi)或輸入域內(nèi)特定的文本。
可以使用正則表達(dá)式來搜索和替換標(biāo)記。
使用正則表達(dá)式的優(yōu)勢(shì):
正則表達(dá)式是用來簡(jiǎn)潔表達(dá)一組字符串的表達(dá)式
正則表達(dá)式是一種通用的字符串表達(dá)框架
正則表達(dá)式是一種針對(duì)字符串表達(dá)“簡(jiǎn)潔”和“特征”思想的工具
正則表達(dá)式可以用來判斷某字符串的特征歸屬
正則表達(dá)式在文本處理中十分常用:
同時(shí)查找或替換一組字符串
匹配字符串的全部或部分(主要)
1.1 正則表達(dá)式語法
正則表達(dá)式語法由字符和操作符構(gòu)成:
常用操作符
. 表示任何單個(gè)字符
[ ] 字符集,對(duì)單個(gè)字符給出取值范圍 ,如[abc]表示a、b、c,[a‐z]表示a到z單個(gè)字符
[^ ] 非字符集,對(duì)單個(gè)字符給出排除范圍 ,如[^abc]表示非a或b或c的單個(gè)字符
* 前一個(gè)字符0次或無限次擴(kuò)展,如abc* 表示 ab、abc、abcc、abccc等
+ 前一個(gè)字符1次或無限次擴(kuò)展 ,如abc+ 表示 abc、abcc、abccc等
? 前一個(gè)字符0次或1次擴(kuò)展 ,如abc? 表示 ab、abc
| 左右表達(dá)式任意一個(gè) ,如abc|def 表示 abc、def
{m} 擴(kuò)展前一個(gè)字符m次 ,如ab{2}c表示abbc
{m,n} 擴(kuò)展前一個(gè)字符m至n次(含n) ,如ab{1,2}c表示abc、abbc
^ 匹配字符串開頭 ,如^abc表示abc且在一個(gè)字符串的開頭
$ 匹配字符串結(jié)尾 ,如abc$表示abc且在一個(gè)字符串的結(jié)尾
( ) 分組標(biāo)記,內(nèi)部只能使用 | 操作符 ,如(abc)表示abc,(abc|def)表示abc、def
\d 數(shù)字,等價(jià)于[0‐9]
\w 單詞字符,等價(jià)于[A‐Za‐z0‐9_]
1.3 正則表達(dá)式re庫的使用
調(diào)用方式:import re
re庫采用raw string類型表示正則表達(dá)式,表示為:r’text’,raw string是不包含對(duì)轉(zhuǎn)義符再次轉(zhuǎn)義的字符串;
1.4 re庫的主要功能函數(shù):
re.search() 在一個(gè)字符串中搜索匹配正則表達(dá)式的第一個(gè)位置,返回match對(duì)象
re.search(pattern, string, flags=0)
re.match() 從一個(gè)字符串的開始位置起匹配正則表達(dá)式,返回match對(duì)象
re.match(pattern, string, flags=0)
re.findall() 搜索字符串,以列表類型返回全部能匹配的子串
re.findall(pattern, string, flags=0)
re.split() 將一個(gè)字符串按照正則表達(dá)式匹配結(jié)果進(jìn)行分割,返回列表類型
re.split(pattern, string, maxsplit=0, flags=0)
re.finditer() 搜索字符串,返回一個(gè)匹配結(jié)果的迭代類型,每個(gè)迭代元素是match對(duì)象
re.finditer(pattern, string, flags=0)
re.sub() 在一個(gè)字符串中替換所有匹配正則表達(dá)式的子串,返回替換后的字符串
re.sub(pattern, repl, string, count=0, flags=0)
flags : 正則表達(dá)式使用時(shí)的控制標(biāo)記:
re.I --> re.IGNORECASE : 忽略正則表達(dá)式的大小寫,[A‐Z]能夠匹配小寫字符
re.M --> re.MULTILINE : 正則表達(dá)式中的^操作符能夠?qū)⒔o定字符串的每行當(dāng)作匹配開始
re.S --> re.DOTALL : 正則表達(dá)式中的.操作符能夠匹配所有字符,默認(rèn)匹配除換行外的所有字符
1.6 re庫的另一種等價(jià)用法(編譯)
regex = re.compile(pattern, flags=0):將正則表達(dá)式的字符串形式編譯成正則表達(dá)式對(duì)象
1.7 re 庫的貪婪匹配和最小匹配
.* Re庫默認(rèn)采用貪婪匹配,即輸出匹配最長(zhǎng)的子串
*? 只要長(zhǎng)度輸出可能不同的,都可以通過在操作符后增加?變成最小匹配
2. 實(shí)例-淘寶商品比價(jià)定向爬蟲
爬取網(wǎng)址:https://s.taobao.com/search?q=書包&js=1&stats_click=search_radio_all%25
爬取思路:
提交商品搜索請(qǐng)求,循環(huán)獲取頁面
對(duì)于每個(gè)頁面,提取商品名稱和價(jià)格信息
將信息輸出到屏幕上
# 導(dǎo)入包
import requests
import re
提交商品搜索請(qǐng)求,循環(huán)獲取頁面
def getHTMLText(url):
"""
請(qǐng)求獲取html,(字符串)
:param url: 爬取網(wǎng)址
:return: 字符串
"""
try:
# 添加頭信息,
kv = { 鄭州婦科醫(yī)院 http://m.zyfuke.com/
'cookie': 'thw=cn; v=0; t=ab66dffdedcb481f77fd563809639584
'user-agent': 'Mozilla/5.0'
}
r = requests.get(url, timeout=30, headers=kv)
# r = requests.get(url, timeout=30)
# print(r.status_code)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "爬取失敗"
對(duì)于每個(gè)頁面,提取商品名稱和價(jià)格信息
def parsePage(ilt,html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.\d]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([price,title])
except:
print('')
將信息輸出到屏幕上
def PrintGoodsList(ilt):
tplt = '{:4}\t{:8}\t{:16}'
print(tplt.format('序號(hào)','價(jià)格','商品名稱'))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count,g[0],g[1]))
def main():
goods = input('please input the goods:')
depth = 3
start_url = 'https://s.taobao.com/search?q='
infoList = []
for i in range(depth):
try:
url = start_url+goods+'&s='+str(44*i)
html = getHTMLText(url)
parsePage(infoList,html)
except:
continue
PrintGoodsList(infoList)
main()
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。