python day 25--正則表示式
阿新 • • 發佈:2018-12-13
一、字元組
1.[0-9]表示匹配0-9中的數字
2.[a-z]表示匹配a-z之間的字母
3.[A-Z]表示匹配大寫的字母
4.[0-9a-zA-Z]匹配所有字母數字
二、元字元
1.\d 匹配任意數字
2.\w 匹配字母數字下劃線
3.\s 匹配任意空字元
4. \n 匹配換行符
5.\t 匹配製表符
6. .(點)匹配除換行符之外的任意字元
7.\D 匹配除數字之外的任意字元
8. \W 匹配除字母數字下劃線之外的任意字元
9.\S 匹配非空字元
10.a|b,匹配符合a或b的字元,當條件有重疊時,應該把範圍廣的放在左邊。
11.(),分組匹配,一般搭配RE模組中的findall,search使用表示優先匹配。
12.[...] 匹配字元組中的字元
13 [^...] 匹配除字元組外的字元
三、量詞
1.* 表示匹配0-無窮次的字元
2. + 匹配1-無窮次的字元
3. ?表示重複0次或一次,在量詞的後面跟了一個 ? 表示取消貪婪匹配 :.*?跟上字元表示匹配任意字元知道找到符合條件的字元就不在找。
4.{n}表示前面的重複n次
5.{n,}表示至少重複n次
6.{n,m}表示重複n-m次,但是以匹配數量多的優先
四、轉義符
在python中\有特殊意義,比如\n表示換行,如果要匹配‘\n’需要在前面加上\,就是'\\n'。如果要匹配‘\\n’,就是‘\\\\n’兩個\\。如果有多個\\就要加幾個\\會有點麻煩,所以只需要在前面加r',r'\n就可以了。
五、re模組的常用方法
1. findall
import re # ret = re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?','-1asdada-200')#前面是正則表示式,後面是待匹配的字元
ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一個存放匹配結果的迭代器
# ret1 = re.findall('www.(oldboy).com','www.oldboy.com')#會優先匹配括號裡的正則表示式,結果:oldboy,(:?oldboy):?表示取消優先匹配
# print(ret)
2.search
# ret = re.search('\d+(.\d+)(.\d+)(.\d+)?','1.2.3.4-2(60(-40.35/5)-(-4*3))')
# print(ret.group())
# print(ret.group(1))
# print(ret.group(2))
# print(ret.group(3))
#search可以節省記憶體,但是列印時要加上.group(),(1)表示顯示第一個,不加數字表示顯示全部
3.spilt
# ret = re.split('\d+','alex83egon20taibai40') # print(ret)
按照匹配到的結果進行切割
4.分組命名
# ret = re.search(r'<(?P<tag>\w+)>(?P<c>\w+)</(\w+)>',r'<a>wahaha</b>') # print(ret.group()) # print(ret.group('tag')) # print(ret.group('c'))
?P<名字>,可以給匹配到的內容命名,這樣.group(名字),可以輸出指定名字的內容
5.爬蟲練習
import re from urllib.request import urlopen # 內建的包 來獲取網頁的原始碼 字串 # res = urlopen('http://www.cnblogs.com/Eva-J/articles/7228075.html') # print(res.read().decode('utf-8')) def getPage(url):#請求內容 response = urlopen(url) return response.read().decode('utf-8') def parsePage(s): # 獲取 網頁原始碼
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)
ret = com.finditer(s)#節省記憶體 for i in ret: ret = { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num") } yield ret def main(num): url = 'https://movie.douban.com/top250?start=%s&filter=' % num # 0 response_html = getPage(url) # response_html是這個網頁的原始碼 str ret = parsePage(response_html) # 生成器 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 = 0 count += 25