python中的re模塊

一.re模塊中的基本功能:
1.查找
1.1 findall:匹配全部每一項符合的結果都會放到列表中,做爲一個元素
用法:re.findall('正則表達式','待匹配的字符串',falg)
1 ret=re.findall('\d+','東方紅5546fuy465胡') 2 print(ret)#['5546', '465']
1.2 search:只匹配符合條件的從左到右的第一個,獲得的不是一個結果,而是一個變量,經過這個變量的group方法來獲取結果
若是沒有匹配到,會返回none,使用group方法會報錯
1 ret=re.search('\d+','東方紅5546fuy465胡') 2 print(ret)  #<_sre.SRE_Match object; span=(3, 7), match='5546'>
3 print(ret.group())  #5546
4 
5 ret=re.search('_','東方紅5546fuy465胡') 6 print(ret)   #None
7 print(ret.group())  # 'NoneType' object has no attribute 'group'
1.3 match:從頭開始匹配,至關於在search中加上一個'^'
1 ret=re.match('\d+','東方紅5546fuy465胡') 2 print(ret)  #None
3 
4 ret1=re.match('\d+','12東方紅5546fuy465胡') 5 print(ret1.group())  #12
2.字符串處理:替換切割
2.1split:切割
1 s='21東方紅5546fuy465胡'
2 ret=re.split('\d+',s) 3 print(ret)  #['', '東方紅', 'fuy', '胡']
4 
5 s='21東方紅5546fuy465胡'
6 ret=re.split('\d',s)#切一的時候默認前面有一個空字符串
7 print(ret)  #['', '', '東方紅', '', '', '', 'fuy', '', '', '胡']
2.1 sub:替換 sub(舊的 新的 誰 替換次數(默認所有替換))
1 ret=re.sub('\d','@@@','12東方紅5546fuy465胡') 2 print(ret)#@@@@@@東方紅@@@@@@@@@@@@fuy@@@@@@@@@胡
3 
4 ret=re.sub('\d+','@@@','12東方紅5546fuy465胡') 5 print(ret)  #@@@東方紅@@@fuy@@@胡
6 
7 subn 返回的是一個元組,元祖的第二個元素是替換的次數 8 ret=re.subn('\d+','@@@','12東方紅5546fuy465胡') 9 print(ret)  #('@@@東方紅@@@fuy@@@胡', 3)
3. re模塊的進階: 時間 空間
3.1 compile(編譯的意思):節省你使用正則表達式解決問題的時間
 1 ret=re.compile('\d+')  2 print(ret)  #re.compile('\\d+') 編譯後的正則表達式
 3 ret1=ret.findall('12東方紅5546fuy465胡')  4 print(ret1)  #['12', '5546', '465']
 5 
 6 ret=re.compile('\d+')  7 ret1=ret.search('12東方紅5546fuy465胡')  8 print(ret1.group())  #12
 9 ret2=ret.match('12東方紅5546fuy465胡') 10 print(ret2.group())   #12
3.2 finditer :節省你使用正則表達式的空間/內存,返回一個迭代器,須要的話能夠循環+group()或者__next__+group()
 1 ret=re.finditer('\d+','12東方紅5546fuy465胡')  2 # print(ret)
 3 # for i in ret:
 4 # print(i.group())
 5 # 12
 6 # 5546
 7 # 465
 8 
 9 # ret=re.finditer('\d+','12東方紅5546fuy465胡')
10 # print(ret.__next__().group()) #12
4 .分組在re模塊中的使用
以前
1 s='<a>wahaha</a>'  #是一個標籤語言 HTML網頁 <a>表示開始 </a>表示結束
2 ret=re.search('>\w+<',s) 3 print(ret.group())
4.1
1 s='<a>wahaha</a>'
2 ret=re.findall('<\w+>(\w+)</(\w+)>',s) 3 print(ret)   #爲了方便,優先使用顯示分組中的內容
4.2
1 s='<a>wahaha</a>'
2 ret=re.search('>(\w+)<',s) 3 print(ret.group()) 4 print(ret.group(1))  #數字表明取對應分組中的內容
4.3 取消分組優先(?:正則表達式)
ret=re.findall('\d+(?:.\d+)?','1.234*56') print(ret)   #['1.234', '56']
4.4 分組與split方法
1 ret = re.split('\d+','alex83taibai40egon25') 2 print(ret)  #['alex', 'taibai', 'egon', '']
3 ret = re.split('(\d+)','alex83taibai40egon25aa') 4 print(ret)  #['alex', 'taibai', 'egon', '']
4.5.1分組命名 (?P<這個組的名字>正則表達式)
1 s='<a>wahaha</a>'
2 ret=re.search('<(?P<start>\w+)>(?P<content>\w+)<(?P<end>/\w+)>',s) 3 print(ret.group(1))  #a 也能夠使用序號
4 print(ret.group('start'))  #a
4.5.2 分組名相同
1 partten='<(?P<start>\w+)>(?P<content>\w+)</(?P=start)>'
2 s='<a>wahaha</a>'
3 ret=re.search(partten,s) 4 print(ret.group())  #<a>wahaha</a>
5 禁止轉義(原樣輸出)  r
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")  #此處的r是禁止轉義的意思 # print(ret)

# print('qwert') # print('qwert\n') #此時輸出qwert和一個空行 # print('qwert\\n') #此時輸出qwert\n # print(r'qwert\n') #此時輸出qwert\n # print(r'qwert\\n') #此時輸出qwert\\n
二.爬蟲實例
將序號,電影,評分和評價人數爬下來
 1 import re  2 from urllib.request import urlopen  3 
 4 def getpage(url): #獲取網頁的字符串
 5     response=urlopen(url)  6     return response.read().decode('utf-8')  7 
 8 def parsepage(s):  9     ret=com.finditer(s) 10     for i in ret: 11         yield { 12             'id':i.group('id'), 13             'name':i.group('name'), 14             'score':i.group('score'), 15             'speak':i.group('speak'), 16  } 17 
18 def main(num): 19     url='https://movie.douban.com/top250?start=%s&filter=' % num 20     respoese_html=getpage(url)  #獲得的是當前那頁網頁的全部字符串的str
21     ret=parsepage(respoese_html)  #獲得的是一個生成器
22     print(ret) 23     for i in ret: 24         print(i) 25 
26 com=re.compile( 27     '<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<name>.*?)</span>.*?'
28     '<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<speak>.*?)</span>',re.S) 29 
30 count=0 31 for i in range(10): 32  main(count) 33     count+=25  #此網頁的特色是25個電影一頁
相關文章
相關標籤/搜索