1. 程式人生 > >用正則表示式提取資訊

用正則表示式提取資訊

這裡寫圖片描述

正則表示式,說白了就是用來匹配字元的,正則表示式是用來簡潔表達一組字串的表示式.
正則表通常被用來檢索、替換那些符合某個模式(規則)的文字。
很多程式語言都支援正則表示式進行字串操作。在程式碼中常簡寫為regex、regexp或RE。
比如Pythonz中就有一個叫:re 的正則表示式庫,這是Python的標準庫,安裝Python後自帶,使用時只需要

import re

我們可以通過requests獲取網頁的頁面資訊,但是其中的資訊太過於雜亂,我們需要從中提取我們需要的資訊,那麼我們可以用Python的正則表示式庫來提取我們需要的資訊,比如說,我們想要從中提取”百度一下,你就知道”的中文字元,我們這樣操作

這裡寫圖片描述

這樣我們就可以把html頁面中的”百度一下,你就知道”的標籤從複雜凌亂的資訊中提取出來了,再經過一些處理就可以拿出來了

語法

那我們開始學習正則表示式的語法了  以下是正則表示式的常用操作符:

.     表示任何單個字元
[ ]    字符集,對單個字元給出取值範圍      [abc]表示a、b、c,[a‐z]表示a到z單個字元
[^ ]   非字符集,對單個字元給出排除範圍     [^abc]表示非a或b或c的單個字元
*     前一個字元0次或無限次擴充套件        abc* 表示 ab、abc、abcc、abccc等
+     前一個字元1次或無限次擴充套件        abc+ 表示 abc、abcc、abccc等
?     前一個字元0
次或1次擴充套件         abc? 表示 ab、abc |     左右表示式任意一個            abc|def 表示 abc、def {m}    擴充套件前一個字元m次            ab{2}c表示abbc {m,n}   擴充套件前一個字元m至n次(含n)       ab{1,2}c表示abc、abbc ^     匹配字串開頭             ^abc表示abc且在一個字串的開頭 $     匹配字串結尾              abc$表示abc且在一個字串的結尾 ( )    分組標記,內部只能使用 | 操作符     (abc)表示abc,(abc|def
)表示abcdef
\d    數字,等價於[09] \w    單詞字元,等價於[AZa‐z09_]

這些都是非常常見的正則表示式操作符,記住了,大部分都能用了。

我們接下來看一下經典的正則表示式匹配例項

^[A‐Za‐z]+$          由26個字母組成的字串
^[A‐Za‐z0‐9]+$        由26個字母和數字組成的字串
^‐?\d+$            整數形式的字串
^[0‐9]*[1‐9][0‐9]*$     正整數形式的字串
[1‐9]\d{5}          中國境內郵政編碼,6位
[\u4e00‐\u9fa5]       匹配中文字元
\d{3}‐\d{8}|\d{4}‐\d{7}   國內電話號碼,010‐68913536

正則表示式庫

上面我們說過,re是Python的內建庫,不需要安裝,直接匯入即可

raw string型別(原生字串型別),也就是不包含對轉義符再次轉義的字串
re庫採用raw string型別表示正則表示式,表示為:     r’text’

re庫的主要函式共有6個,分別是

re.search()     在一個字串中搜索匹配正則表示式的第一個位置,返回match物件
re.match()      從一個字串的開始位置起匹配正則表示式,返回match物件
re.findall()     搜尋字串,以列表型別返回全部能匹配的子串
re.split()      將一個字串按照正則表示式匹配結果進行分割,返回列表型別
re.finditer()    搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件
re.sub()       在一個字串中替換所有匹配正則表示式的子串,返回替換後的字串

re.findall( )這個比較簡單常用,用法如下:
這個函式共有三個引數,pattern, string , flags

re.findall(pattern, string, flags=0)
搜尋字串,以列表型別返回全部能匹配的子串

∙ pattern : 正則表示式的字串或原生字串表示
∙ string  : 待匹配字串
∙ flags 正則表示式使用時的控制標記

比如我們要從一堆字元中,把數字提取出來:

這裡寫圖片描述

其他函式的使用例項

這裡寫圖片描述

定向爬蟲

爬取豆瓣電影,上海熱映的電影:

我們需要定義一個函式,用於獲取豆瓣熱映的電影資訊:

import requests   //匯入需要用到的庫
import re

def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("Erro_get")

我們還需要定義一個函式,用於提取所需要的電影資訊:

def parsePage(ilt,html):

    tlt = re.findall(r'data-title\=\".*?\"',html)
    for i in range(len(tlt)):
        plt = eval(tlt[i].split('=')[1])
        if plt in ilt:
            pass
        else:
            ilt.append(plt)

然後第三個函式用於輸出電影列表:

def printInfo(ilt):
    print("上 海 熱 映")
    for i in ilt:
        print(i)

再定義一個主函式去呼叫這些功能函式:

def main():
    url = 'https://movie.douban.com/cinema/nowplaying/shanghai/'
    kv = {'User-Agent' : 'Mozilla/5.0'}
    list = []
    html = getHTMLText(url)
    parsePage(list,html)
    printInfo(list)

main()

執行即可看到以下畫面:

這裡寫圖片描述

總結

re庫的功能非常強大,這些只是一些非常淺顯的內容。
大家可以多實戰,掌握正則表示式的用法。