一、今日內容
python中的方法
python中的方法+正則運算式的新內容
#分組
#分組命名
#參考分組
#爬蟲的小例子
1、轉義符
如:\n--->\\n--->print('\\n')#\n
如:print('\\\\n')#\\n
print(r'\n')
print(r'\\n')
#正則運算式中的轉義符在python的字串中也剛好有轉義的作用
#但是正則運算式中的轉義和字串中的轉義符并沒關系
#且還容易沖突
#為避免這種沖突
#我們所有的正則都以工具中的測驗結果為結果
#然后只需要在正則和待匹配的字串外面的都加‘r’即可,
如:
print(r'\n')
print(r'\\n')
2、re模塊(findall,search,match)
import re
ret=re.findall('\d',alex83)
ret=re.findall('\d+',alex83)
print(ret)
#findall會匹配字串中所有符合規則的項
#并回傳一個串列
#如果未匹配到回傳空串列
ret=re.search('\d','alex83')
print(ret)#如果能匹配上回傳一個物件,如果不能匹配,回傳none
if ret:
print(ret.group())#8
#如果是物件,那么這個物件內部實作了group,所以可以取值,
#如果是none,那么這個物件不可能實作了group方法,所以報錯
#會從頭到尾從帶匹配匹配字串中取出第一個符合條件的項,
#如果匹配到了,回傳一個物件,用group取值,
#如果沒匹配到,回傳none,不能用group,
ret=re.search('\d+','alex83')
print(ret)
print(ret.group())#83
re.match
ret=re.match('\d','6alex83')==re.match('^\d','6alex83')
print(ret)
print(ret.group())#6
#會從頭匹配字串中取出從第一個字符開始是否符合規則
#如果符合,就回傳物件,用group取值,
#如果不符合,就回傳none
#match=search+正則
3、re其他方法及拓展
1、時間復雜度,效率 compile
#在同一個正則運算式重復使用多次的時候使用能夠減少時間開銷,
2、空間復雜度,記憶體占用率 finditer
#在查詢的結果超過1個情況下,能夠有效的節省記憶體,降低空間復雜度,從而也降低了時間復雜度,
3、用戶體驗
大資料量的時候:
import re
ret=re.findall('\d','alhlajanlha12llhlajlmahlj4'*2000000)
print(ret)
=====
import re
ret=re.finditer('\d','alhlajanlha12llhlajlmahlj4'*2000000)
for i in ret:#迭代出來的每一項都是一個物件
print(i.group())#通過group取值即可
re.compile()
#\d正則運算式,---》字串
#\d str,回圈str,找到所有的數字,
s = '<div >.*?<div >.*?<em .*?>(?P<id>\d+).*?<span >(?P<title>.*?)</span>' '.*?<span .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)評價</span>'
ret=re.compile('\d+')
print(ret)
r1=ret.search('alex83')
print(r1)
print(r1.group())
ret.findall('wusu74')
ret.finditer('taibai40')
#finditer作用:
r3=ret.finditer('taibai40')
print(r3)
for i in r3:
print(i.group())
#re.sub
#re.split
import re
ret=re.split('\d+','alex83wusir74taibai50')#默認只保留分組中的內容
print(ret)
#['alex', 'wusir', 'taibai', ''],以數字分割,最后一個空字符,是50切割出來的,
import re
ret=re.split('(\d+)','alex83wusir74taibai50')
print(ret)
#['alex', '83', 'wusir', '74', 'taibai', '50', '']
ret=re.split('\d(\d)','alex83wusir74taibai50')
print(ret)
#['alex', '3', 'wusir', '4', 'taibai', '0', '']
import re
ret=re.sub('\d','D','alex83wusir74taibai50')
print(ret)
rett=re.subn('\d','D','alex83wusir74taibai50')
print(rett)
alexDDwusirDDtaibaiDD
('alexDDwusirDDtaibaiDD', 6)
總結:
findall 引數順序和資料型別,回傳值型別
search
match
compile
finditer
sub
subn
(1)、分組的概念和re模塊
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
ret=re.search('<(\w+)>(.*?)</\w+>',s1)
print(ret)
print(ret.group())#默認為0,取所有
print(ret.group(1))#第一個分組
print(ret.group(2))#第二個分組
#另解方法:[a-z\d]+
分組命名方法:
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
ret=re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1)
print(ret)
print(ret.group())#默認為0,取所有
print(ret.group("tag"))#tag分組
print(ret.group("cont"))#cont分組
分組命名:
(?P<名字>正則運算式)
參考分組(?P=組名)這個組中的內容必須完全和之前已經存在的組匹配到的內容一模一樣,
參考分組:
s1=<h1>wahaha</h1>
ret=re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1)
print(ret)
print(ret.group('tag'))
====
ret=re.search(r'<(\w+)>.*?</\1>',s1)#轉義1(\1)的用法,如果不加r,\1為空,
print(ret)
print(ret.group(1))
總結:
splist
#會保留分組中應該被切割掉的內容
分組命名
(?P<命名>正則) search group('組名')
參考分組
(?P=組名)表示這個組中的內容必須和之前已經存在的一組匹配到的內容完全一致,
分組和findall
#默認findall優先顯示分組內的內容
#取消分組優先顯示(?:正則)
實體:
import re
ret=re.findall('\d(\d)','al1xel83')
#findall遇到正則運算式中的分組,會優先顯示分組中的內容
print(ret)
ret0=re.findall('\d+(\.\d+)?','1.234+2')
print(ret0)
ret1=re.findall('\d+(?:\.\d+)?','1.234+2')
print(ret1)
['3']
['.234', '']
['1.234', '2']
#例題:
#有的時候我們想匹配的內容包含在不相匹配的內容當中,這個時候只需要把不想匹配的先匹配出來,再通過手段去掉,
import re
ret=re.findall("\d+\.\d+|\d","1-2*(60+(-40.35/5)-(-4*3))")
ret1=re.findall("\d+\.\d+|(\d)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
print(ret1)
ret1.remove('')
print(ret1)
(2)爬蟲實體(爬豆瓣)
import requests
import re
N=0
header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
for n in range(10):
ret=requests.get('https://movie.douban.com/top250?start=%s&filter='%(N,),headers=header)
content=ret.text
parrter='<div >.*?<em >(?P<id>\d+)</em>.*?<span >(?P<title>.*?)</span>.*?<span property="v:average">(?P<score>.*?)</span>.*?<span>(?P<num>.*?)人評價</span>'
res=re.finditer(parrter,content,flags=re.S)#如果使用findall,產生的內容放在串列中,串列每個元素都是一個元組,
for i in res:
print({'id':i.group('id'),'title':i.group('title'),'score':i.group('score'),'num':i.group('num')})
N+=25
(3)遞回和堆疊(實作三級選單的回傳和退出功能)
一、遞回
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'網易': {},
'google': {}
},
'中關村': {
'愛奇藝': {},
'汽車之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龍觀': {},
},
'朝陽': {},
'東城': {},
},
'上海': {
'閔行': {
"人民廣場": {
'炸雞店': {}
}
},
'閘北': {
'火車戰': {
'攜程': {}
}
},
'浦東': {},
},
'山東': {},
}
def func_menu(menu):
while True:
for key in menu:
print(key)
nip=input("請輸入:").strip()
if nip.upper()=='Q':#退出
return 'q'
if nip.upper()=="B":#回傳上級
return #return 回傳上一級
elif menu.get(nip):
flag=func_menu(menu[nip])
if flag=='q':return 'q'
func_menu(menu)
二、堆疊
lst=[menu]
print(lst[-1].keys())
while lst:
for key in lst[-1]:
print(key)
inp=input('>>>')
if inp.upper()=='Q':break
elif inp.upper()=='B':lst.pop()
elif lst[-1].get(inp):
lst.append(lst[-1][inp])
(4)使用listdir求檔案夾大小
import os
path1=r'E:\新建檔案夾\teaching_plan'
lst=[path1]
size=0
while lst:
path=lst.pop()
name_lst=os.listdir(path)
for name in name_lst:
full_name=os.path.join(path,name)
if os.path.isdir(full_name):
lst.append(full_name)
elif os.path.isabs(full_name):
size+=os.path.getsize(full_name)
print(size)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/180067.html
標籤:Python
