python開發模塊基礎:re正則
阿新 • • 發佈:2017-08-10
response esp tex 整數 bin res re.search 第一個 開始
一,re模塊的用法
#findall #直接返回一個列表
#正常的正則表達式
#但是只會把分組裏的顯示出來
#search #返回一個對象 .group()
#match #返回一個對象 .group()
1 import re 2 #re模塊的用法 3 4 ret = re.findall(‘a‘, ‘eva egon yuan‘) # 返回所有滿足匹配條件的結果,放在列表裏 5 print(ret) #結果 : [‘a‘, ‘a‘] 6 7 ret = re.search(‘a‘, ‘eva egon yuan‘).group() 8 print(ret) #結果 : ‘a‘ 9 # 函數會在字符串內查找模式匹配,只到找到第一個匹配然後返回一個包含匹配信息的對象,該對象可以 10 # 通過調用group()方法得到匹配的字符串,如果字符串沒有匹配,則返回None。 11 12 ret = re.match(‘a‘, ‘abc‘).group() # 同search,不過盡在字符串開始處進行匹配 13 print(ret) 14 #結果 : ‘a‘ 15 16 ret = re.split(‘[ab]‘, ‘abcd‘) # 先按‘a‘分割得到‘‘和‘bcd‘,在對‘‘和‘bcd‘分別按‘b‘分割 17 print(ret) # [‘‘, ‘‘, ‘cd‘]18 19 ret = re.sub(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘, 1)#將數字替換成‘H‘,參數1表示只替換1個 20 print(ret) #evaHegon4yuan4 21 22 ret = re.subn(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘)#將數字替換成‘H‘,返回元組(替換的結果,替換了多少次) 23 print(ret) 24 25 obj = re.compile(‘\d{3}‘) #將正則表達式編譯成為一個 正則表達式對象,規則要匹配的是3個數字 26 ret = obj.search(‘abc123eeee‘) #正則表達式對象調用search,參數為待匹配的字符串27 print(ret.group()) #結果 : 123 28 29 import re 30 ret = re.finditer(‘\d‘, ‘ds3sy4784a‘) #finditer返回一個存放匹配結果的叠代器 31 print(ret) # <callable_iterator object at 0x10195f940> 32 print(next(ret).group()) #查看第一個結果 33 print(next(ret).group()) #查看第二個結果 34 print([i.group() for i in ret]) #查看剩余的左右結果 35 36 #註意: 37 #1 findall的優先級查詢 38 import re 39 40 ret = re.findall(‘www.(baidu|oldboy).com‘, ‘www.oldboy.com‘) 41 print(ret) # [‘oldboy‘] 這是因為findall會優先把匹配結果組裏內容返回,如果想要匹配結果,取消權限即可 42 43 ret = re.findall(‘www.(?:baidu|oldboy).com‘, ‘www.oldboy.com‘) 44 print(ret) # [‘www.oldboy.com‘] 45 46 #2 split的優先級查詢 47 ret=re.split("\d+","eva3egon4yuan") 48 print(ret) #結果 : [‘eva‘, ‘egon‘, ‘yuan‘] 49 50 ret=re.split("(\d+)","eva3egon4yuan") 51 print(ret) #結果 : [‘eva‘, ‘3‘, ‘egon‘, ‘4‘, ‘yuan‘] 52 53 #在匹配部分加上()之後所切出的結果是不同的, 54 #沒有()的沒有保留所匹配的項,但是有()的卻能夠保留了匹配的項, 55 #這個在某些需要保留匹配部分的使用過程是非常重要的。 56 57 #findall #直接返回一個列表 58 #正常的正則表達式 59 #但是只會把分組裏的顯示出來 60 61 #search #返回一個對象 .group() 62 #match #返回一個對象 .group()
練習題
1 #!/usr/bin/python env 2 #_*_coding:utf-8_*_ 3 4 #1、匹配標簽 5 import re 6 ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") 7 #還可以在分組中利用?<name>的形式給分組起名字 8 #獲取的匹配結果可以直接用group(‘名字‘)拿到對應的值 9 print(ret.group(‘tag_name‘)) #結果 :h1 10 print(ret.group()) #結果 :<h1>hello</h1> 11 12 ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>") 13 #如果不給組起名字,也可以用\序號來找到對應的組,表示要找的內容和前面的組內容一致 14 #獲取的匹配結果可以直接用group(序號)拿到對應的值 15 print(ret.group(1)) 16 print(ret.group()) #結果 :<h1>hello</h1> 17 18 #2、匹配整數 19 import re 20 ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") 21 print(ret) #[‘1‘, ‘2‘, ‘60‘, ‘40‘, ‘35‘, ‘5‘, ‘4‘, ‘3‘] 22 ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") 23 print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘‘, ‘5‘, ‘-4‘, ‘3‘] 24 ret.remove("") 25 print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘5‘, ‘-4‘, ‘3‘] 26 27 #3、數字匹配 28 # 1、 匹配一段文本中的每行的郵箱 29 # http://blog.csdn.net/make164492212/article/details/51656638 30 # 2、 匹配一段文本中的每行的時間字符串,比如:‘1990-07-12’; 31 # 32 # 分別取出1年的12個月(^(0?[1-9]|1[0-2])$)、 33 # 一個月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 34 # 3、 匹配qq號。(騰訊QQ號從10000開始) [1,9][0,9]{4,} 35 # 4、 匹配一個浮點數。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d* 36 # 5、 匹配漢字。 ^[\u4e00-\u9fa5]{0,}$ 37 # 6、 匹配出所有整數
爬豆瓣網頁匹配
1 #!/usr/bin/python env 2 #_*_coding:utf-8_*_ 3 import re 4 import json 5 import requests #urlopen 6 7 def getPage(url): 8 response = requests.get(url) 9 return response.text 10 11 def parsePage(s): 12 com = re.compile( 13 ‘<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>‘ 14 ‘.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)評價</span>‘, re.S) 15 16 ret = com.finditer(s) 17 for i in ret: 18 yield { 19 "id": i.group("id"), 20 "title": i.group("title"), 21 "rating_num": i.group("rating_num"), 22 "comment_num": i.group("comment_num"), 23 } 24 25 def main(num): 26 url = ‘https://movie.douban.com/top250?start=%s&filter=‘ % num 27 response_html = getPage(url) 28 ret = parsePage(response_html) 29 print(ret) 30 f = open("move_info7", "a", encoding="utf8") 31 32 for obj in ret: #循環生成器 33 print(obj) 34 data = json.dumps(obj, ensure_ascii=False) 35 f.write(data + "\n") 36 37 count = 0 38 for i in range(10): 39 main(count) 40 count += 25
python開發模塊基礎:re正則