re模塊:最適合在script中提取內容
re是python正則模塊標準庫
經常使用元字符:
. 匹配除換行符之外的任意字符
\w 匹配字母或數字或下劃線
\s 匹配任意的空白字符,空格,製表符,換頁符
\d 匹配0~9 之間的數字
\n 匹配一個換行符
^ 匹配字符串的開始
$ 匹配字符串的結束
\S 匹配任何非空白字符
\W 匹配非字母或數字或下劃線
\D 匹配非數字
() 匹配括號內的表達式,也表式一個組
[...] 匹配字符組中的字符
[^...] 匹配除了字符組中字符的全部字符
量詞:
控制前面的元字符出現的次數
* 重複0次或更屢次
+ 重複1次或更屢次
? 重複0次或1次
{n} 重複n次
{n,} 重複n次或更屢次
{n,m} 重複n到m次
貪婪匹配和惰性匹配
.* 貪婪匹配
.* ? 貪婪匹配
re模塊中爬蟲程序主要使用的功能
findall 查找全部,返回list
finditer 查找全部,返回迭代器,需用for循環取出裏面的值
search 會進行匹配,若是匹配到了一個結果就會返回這個結果,若是匹配不上就返回none
match 只能從字符串的開頭進行匹配
compile() 將一個長正則進行預加載,方便後面的使用
單獨提取正則中的內容:
可經過給分組起名字的方法對正則中的內容進行單獨提取
基本結構:
import re
obj = re.compile(r"",re.S)
例:
import re
# findall:匹配字符串中全部符合正則的內容
lst = re.findall(r"\d+","個人電話是:10086,他的電話是:10010")
print(lst)
# finditer:匹配字符串中全部的內容【返回的是迭代器】,從迭代器中拿到內容須要.group()函數
it = re.finditer(r"\d+","個人電話是:10086,他的電話是:10010")
for i in it:
print(i.group())
# search:全文匹配找到一個結果就返回,返回的結果是match對象,若是拿不到結果返回none,拿數據須要.group()函數
s = re.search(r"\d+","個人電話是:10086,他的電話是:10010")
print(s.group())
# match:從頭開始匹配
s = re.match(r"\d+","111,個人電話是:10086,他的電話是:10010")
print(s.group())
# 預加載正則表達式,可在多處重複使用
obj = re.compile(r"\d+")
ret = obj.finditer("個人電話是:10086,他的電話是:10010")
for it in ret:
print(it.group())
ret = obj.findall("個人電話是:10086,他的電話是:10010")
print(ret)
# 單獨提取正則中的內容:(?P<分組名字>正則):單獨從正則匹配的內容中再進一步提取所須要的內容
st = """
<div class='西遊記'><span id='1'>孫悟空</span></div>
<div class='水滸傳'><span id='2'>林沖</span></div>
<div class='三國演義'><span id='3'>劉關張</span></div>
<div class='紅樓夢'><span id='4'>賈寶玉</span></div>
"""
# (?P<分組名字>正則):單獨從正則匹配的內容中再進一步提取所須要的內容
obj = re.compile(r"<div class='.*?'><span id='\d+'>(?P<hahaha>.*?)</span></div>",re.S) #re.S能夠讓.匹配任意字符
rest = obj.finditer(st)
for i in rest:
print(i.group())
print(i.group("hahaha"))