1. 程式人生 > >python記錄_day23 正則表示式 re模組

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>.*?)&nbsp;&nbsp;&nbsp;.*?<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()
練習