python 模塊之路 re模塊運用
阿新 • • 發佈:2018-08-17
計算器 pan douban odin 函數 源碼 除法 main back
re模塊 正則混合使用
永遠不要起一個py文件的名字 這個名字和你已知的模塊同名 而且沒有意義 文件名字要有意義
查找:
findall : 匹配所有 每一項都是列表中的一個元素 ret = re.findall(‘\d+‘,‘sjkhk172按實際花費928‘) # 正則表達式,帶匹配的字符串,flag ret = re.findall(‘\d‘,‘sjkhk172按實際花費928‘) # 正則表達式,帶匹配的字符串,flag print(ret) search : 只匹配從左到右的第一個,得到的不是直接的結果,而是一個變量,通過這個變量的group方法來獲取結果# 如果沒有匹配到,會返回None,使用group會報錯 ret = re.search(‘\d+‘,‘sjkhk172按實際花費928‘) print(ret) # 內存地址,這是一個正則匹配的結果 print(ret.group()) # 通過ret.group()獲取真正的結果 ret = re.search(‘\d‘,‘owghabDJLBNdgv‘) print(ret) print(ret.group()) ret = re.search(‘\d+‘,‘sjkhk172按實際花費928‘) if ret : # 內存地址,這是一個正則匹配的結果 print(ret.group()) # 通過ret.group()獲取真正的結果
match 從頭開始匹配,相當於search中的正則表達式加上一個^ ret = re.match(‘\d+$‘,‘172sjkhk按實際花費928‘) print(ret) # 字符串處理的擴展 : 替換 切割 # split s = ‘alex|taibai|egon|‘ print(s.split(‘|‘)) s = ‘alex83taibai40egon25‘ ret = re.split(‘\d+‘,s) print(ret) # sub # 誰 舊的 新的 替換次數 ret = re.sub(‘\d+‘,‘H‘,‘alex83taibai40egon25‘) print(ret) ret = re.sub(‘\d+‘,‘H‘,‘alex83taibai40egon25‘,1) print(ret) # subn 返回一個元組,第二個元素是替換的次數 ret = re.subn(‘\d+‘,‘H‘,‘alex83taibai40egon25‘) print(ret)
re模塊的進階 : 時間 / 空間
compile 節省使用正則表達式解決問題的時間
編譯 正則表達式 編譯成字節碼
在多次使用的過程中 不會多次編譯
ret = re.compile(‘\d+‘) # 已經完成編譯了 print(ret) res = ret.findall(‘alex83taibai40egon25‘) print(res) res = ret.search(‘sjkhk172按實際花費928‘) print(res.group()) finditer 節省你使用正則表達式解決問題的空間/內存 ret = re.finditer(‘\d+‘,‘alex83taibai40egon25‘) for i in ret: print(i.group())
findall 返回列表 找所有的匹配項
search 匹配就 返回一個變量, 通過group取到匹配到的第一個值, 不匹配就返回None , group會報錯
match 相當於search 的正則表達式中加了一個‘ ^‘
spilt 返回列表, 按照正則規則切割, 默認匹配的內容會被切掉
sub / subn 替換, 按照正則規則去尋找要被替換的內容,subn返回元祖, 第二個值是替換的次數
compile 編譯一個正則表達式, 用這個結果去search match findall finditer 能夠節省時間
finditer 返回一個叠代器 所有的結果都在這個叠代器中,需要通過循壞+ group 的形式取值 能夠節省內存
分組在re模塊中的使用
import re
s = ‘<a>wahaha</a>‘ # 標簽語言 html 網頁 ret = re.search(‘<(\w+)>(\w+)</(\w+)>‘,s) print(ret.group()) # 所有的結果 print(ret.group(1)) # 數字參數代表的是取對應分組中的內容 print(ret.group(2)) print(ret.group(3)) # 為了findall也可以順利取到分組中的內容,有一個特殊的語法,就是優先顯示分組中的內容 ret = re.findall(‘(\w+)‘,s) print(ret) ret = re.findall(‘>(\w+)<‘,s) print(ret) # 取消分組優先(?:正則表達式) ret = re.findall(‘\d+(\.\d+)?‘,‘1.234*4‘) print(ret) # 關於分組 # 對於正則表達式來說 有些時候我們需要進行分組,來整體約束某一組字符出現的次數 (\.[\w]+)? # 對於python語言來說 分組可以幫助你更好更精準的找到你真正需要的內容 <(\w+)>(\w+)</(\w+)> split ret = re.split(‘\d+‘,‘alex83taibai40egon25‘) print(ret) ret = re.split(‘(\d+)‘,‘alex83taibai40egon25aa‘) print(ret) # python 和 正則表達式 之間的特殊的約定 # 分組命名 (?P<這個組的名字>正則表達式) s = ‘<a>wahaha</a>‘ ret = re.search(‘>(?P<con>\w+)<‘,s) print(ret.group(1)) print(ret.group(‘con‘)) s = ‘<a>wahaha</a>‘ pattern = ‘<(\w+)>(\w+)</(\w+)>‘ ret = re.search(pattern,s) print(ret.group(1) == ret.group(3)) # 使用前面的分組 要求使用這個名字的分組和前面同名分組中的內容匹配的必須一致 pattern = ‘<(?P<tab>\w+)>(\w+)</(?P=tab)>‘ ret = re.search(pattern,s) print(ret) 2018-12-06 2018.12.6 2018 12 06 12:30:30
使用正則表達式的技巧
import re
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") # 從"1-2*(60+(-40.35/5)-(-4*3))"中取整數 [‘1‘, ‘2‘, ‘60‘, ‘40‘, ‘35‘, ‘5‘, ‘4‘, ‘3‘] print(ret) # 你要匹配的內容太沒有特點了 容易和你不想匹配的內容混在一起 # 精準的取到整數 過濾掉小數 ret=re.findall(r"\d+\.\d+|\d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret) ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove(‘‘) print(ret)
正則表達式如果寫的足夠好的話 能夠最大限度的簡化我們的操作
正則表達式重要到什麽程度
掌握平時作業
能夠看懂常用的正則表達式
並且能夠做出一些公司特異性要求的修改
簡單爬蟲實列
import re
def getPage(url): # 獲取網頁的字符串 response = urlopen(url) return response.read().decode(‘utf-8‘) def parsePage(s): ret = com.finditer(s) # 從s這個網頁源碼中 找到所有符合com正則表達式規則的內容 並且以叠代器的形式返回 for i in ret: yield { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num"), } def main(num): # 0 25 50 # 這個函數執行10次,每次爬取一頁的內容 url = ‘https://movie.douban.com/top250?start=%s&filter=‘ % num response_html = getPage(url) # response_html就是這個url對應的html代碼 就是 str ret = parsePage(response_html) # ret是一個生成器 print(ret) f = open("move_info7", "a", encoding="utf8") for obj in ret: print(obj) data = str(obj) f.write(data + "\n") f.close() com = re.compile( ‘<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>‘ ‘.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)評價</span>‘, re.S) count = 0 for i in range(10): main(count) count += 25
計算器 作業 經典題目
# ret = 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) # print(ret) #偷雞做法 答案直接輸出 # s = ‘1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )‘ # print(eval(s)) # 第二種偷雞 答案直接輸出
思路如下:
s = ‘1 - 2 * 12‘
# 正則表達式 函數 循環
# 匹配內層不再有括號的子表達式
# 計算
# 先計算乘除法
# 再計算加減法
# 一個括號計算完畢
# 將結果和括號進行替換
# 如何處理符號
# 1.先把所有的空格去掉
# 匹配 內層不再有括號的子表達式
# 匹配乘除法
# 匹配加減法
# 2.遠離遞歸,如果要用遞歸,請考慮返回值的問題
拼搏 努力
python 模塊之路 re模塊運用