python記錄_day23 正則表示式 re模組
一、 正則表示式
使用python的re模組之前應該對正則表示式有一定的瞭解
正則表示式是對字串操作的一種邏輯公式。我們一般使用正則表示式對字串進行匹配和過濾。
正則的優缺點:
優點:靈活, 功能性強, 邏輯性強.
缺點:上手難,但一旦學會這東西非常好用
# 正則表達的組成:普通字元、元字元、限定符
普通字元不用說的,就是常用的字母,數字,漢字這些
##貪婪匹配
.* 點星 表示儘可能多的匹配
## 惰性匹配
.*? 點星問號 儘可能少的匹配
## 轉義
對 “\” 進行轉義可以用 “\\” ,也可以在字串開頭加上r
## () 表示分組,括號內的表示式是一個整體 如果一個表示式中有分組y,那麼()後面的 \1 表示拿前邊組的匹配結果
二、re模組
re模組是python提供的一套關於處理正則表示式的模組. 核心功能有四個:
re.search() #搜尋,搜到結果就返回,沒有結果返回None
re.mathc() #只能從頭開始匹配 相當於預設加了^
re.findall() #返回所有匹配項
re.finditer() #返回所有匹配項的迭代器
1 import re 2 3 # 搜尋,搜到結果就返回 4 ret = re.search("a","alex") 5 print(ret.group()) #結果要用group來取 6 7 #從頭開始匹配,匹配到就返回 8 a = re.match('回','回眸一笑百媚生') #相當於匹配 ^a 預設加了開頭符 9 print(a.group()) 10 11 #返回所有匹配項 列表 12 lst =re.findall('a','alexa核心操作') 13 print(lst) 14 15 #返回一個迭代器 16 ret = re.finditer('a','alexa') 17 for el in ret: 18 print(el.group()) 19 print(el)
##其他操作
re.split() #根據正則表示式進行切割
re.split("(表示式)","str") #切割後保留切割的內容
re.sub() #替換
re.subn() #替換 返回的是一個元組
re.compile(表示式, re.S) #把正則表示式預載入 引數re.S能讓惰性匹配忽略換行
注意:
在re中()的優先順序比較高,會優先返回括號內匹配的內容
(?:) 在括號里加?:表示取消優先順序
(?P<name>) 這樣是給()匹配的內容命名
1 #() 表優先順序 2 b = re.findall(r'www\.(baidu|oldboy)\.com','www.baidu.com') 3 print(b) 4 5 # ?:取消()優先順序 6 c = re.findall(r'www.(?:baidu|oldboy).com','www.baidu.com') 7 print(c) 8 9 #切割 10 ret = re.split('[ab]','github is a good websit') 11 print(ret) 12 13 ret = re.split('([ab])','github is a good websit') 14 print(ret) 15 16 #替換 17 ret = re.sub('good','well','github is a good website') 18 print(ret) 19 ret = re.subn('g','G','github is a good website') 20 print(ret) 21 22 #預載入 23 a = re.compile(r'anala\b') # 正則中\b表示匹配結尾是什麼什麼 24 print(a) 25 ret = a.search('lexahanala') 26 print(ret.group()) 27 28 #給組起名字 29 obj = re.compile(r'alex(?P<name>\d+)and(w)') 30 res = obj.search("alex250andwusir38ritian2") 31 print(res.group()) 32 # for el in res.group(): 33 # print(el) 34 print(res.group(2)) 35 print(res.group('name'))其他操作
1 #豆瓣排行top250 2 3 from urllib.request import urlopen 4 import re 5 6 #預載入正則表示式 7 obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?導演: (?P<director>.*?) .*?<span class="rating_num" property="v:average">(?P<fen>.*?)</span>',re.S) 8 #獲取網頁內容 9 def getContent(url): 10 content = urlopen(url).read().decode('utf-8') 11 return content 12 13 #解析內容 14 def parseContent(content): 15 it = obj.finditer(content) 16 for el in it: 17 yield { 18 "電影名":el.group("name"), 19 "導演": el.group('director'), 20 "評分":el.group('fen') 21 } 22 23 for i in range(10): 24 url = 'https://movie.douban.com/top250?start=%s&filter=' %(i*25) 25 g = parseContent(getContent(url)) 26 f = open('douban.txt', mode='a', encoding='utf-8') 27 for el in g : 28 f.write(str(el)+'\n') 29 f.close()練習