1. 程式人生 > >python開發模塊基礎:re正則

python開發模塊基礎:re正則

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正則