1. 程式人生 > >python day 25--正則表示式

python day 25--正則表示式

一、字元組

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