python網路爬蟲學習筆記之之正規表示式

2021-08-10 08:52:47 字數 4843 閱讀 8096

1.表達很多字串 可以直接使用乙個正規表示式

2.表達無窮多個字串時 比如 py+就表示p後邊跟乙個y或者無窮多個y時的情況 

3.比如一組字串有某種特點,很難將它們列舉出來就可以使用正規表示式來進行

比如說 一組字串需要以'py'開頭 後續存在不多於10個字串,後續字串不得出現『p』或者『y』 當然你可以把所有的情況列舉出來 但是太繁瑣,於是你可以使用正規表示式

py[^py] 就可以滿足以上條件

正規表示式在文字處理中十分常用:

1.表達文字型別的特徵(病毒,入侵)

2.同時查詢或者替換一組字串

3.可以匹配字串的全部或者部分

其實正規表示式主要使用在字串的匹配中

正規表示式的使用:

編譯:將符合正規表示式語法的字串轉換成正規表示式的特徵,正規表示式其實就是某一種語法格式,但是在程式中我們必須使用字串的格式 來表達它

我們可以認為編譯後的特徵與一組字串進行對應

正規表示式由字元和操作符構成

正規表示式的常用操作符:

.   表示任意單個字元

字符集,對單個字元給出取值範圍   [abc]表示a b c  [a-z] 表示a到z單個字元

[^]非字符集 對單個字元給出排除範圍   [^abc]表示非a b c 的的單個字元

* 表示0 或者無限次擴充套件  abc*表示 ab abc abcc  abcccc等

+表示1或者無限次擴充套件 abc+ 表示abc abcc  abccc等

?表示0或者1次擴充套件 abc?表示ab abc

|表示左右任乙個    abc|def 表示abc或者是def

表示擴充套件前乙個字元m次    abc 表示abbc

表示擴充套件前乙個字元m到n次 (含n次) abc表示abc abbc

^匹配字串的開頭   ^abc 表示abc且在乙個字串的開頭

s匹配字串的結尾  abcs表示abc且在乙個字串的結尾

()分組標記 內部只能使用|操作符 比如(abc)表示abc  (abc|def)標識abc 或者 def

\d表示數字  等價於0-9

\w表示單詞字元 等價於

比如說一段ip位址  0~255 四個前面的數字都是這個範圍 那我們該如何表達這個0~255數字呢

其實需要分成四個部分分別寫

首先0~99  [1-9]?\d  (注意十位和個位是不一樣的 )

100~199    1[0-9]

200~249    2[0-4]\d

250~255    25[0-5]

所以一段ip位址可以表示為

(([1-9]?\d | 1[0-9] | 2[0-4]\d | 25[0-5]).) (([1-9]?\d \1[0-9] | 2[0-4]\d | 25[0-5]))   之所以前三個和後乙個 分開是因為前三個後邊都有.  最後乙個後面是沒有點的   其他數值部分表示都是一樣的

re庫是python的標準庫,主要是用來匹配字串

正規表示式的表示型別

raw  string(原生字串型別)

re庫採用raw string 型別表示正規表示式,表示為 r'text'

原生的字串型別和一般的字串型別所不同的是 前面要加乙個r

原生字串型別是不包括轉義字元的字串

原生字串中間的\不被解釋為轉義字元

如果乙個字串中間出現了轉義字元時 如果使用字串進行表示那麼所有的轉義字元前面都要加上乙個\ 很麻煩啊

所以我們建議  當正規表示式包含轉義符時 我們使用raw string   只需在字串前面加乙個r即可

re.search()  在乙個字串中搜尋匹配正規表示式的第乙個位置,返回match物件

re.match()  在乙個字串的開始位置匹配正規表示式,返回match物件

re.findall() 搜尋字串 以列表型別返回全部可以匹配的字串

re.split() 將乙個字串按照正規表示式匹配結果進行分割,返回列表型別

re.finditer() 搜尋字串,返回乙個匹配結果的迭代型別,每個迭代型別都是match物件   ???沒看懂啊

re.sub() 在乙個字串中替換所有的匹配正規表示式的字串,返回替換後的字串

下面詳細介紹這六個函式的具體使用:

re.search(pattern,string,flags=0)

pattern:正規表示式的字串或者原生字串表示

string 待匹配的字串

flags  正規表示式使用時的控制標記   主要介紹三種: re.i    忽略正規表示式的大小寫,[a-z]也可以匹配小寫字元

re.m 正規表示式中的^操作符能夠將給定字串的每行當作匹配的開始

re.s 正規表示式中的.可以匹配所有字元,預設的re庫中.操作符可以匹配除了換行符以外的所有字元

import re 

match=re.search(r'[1-9]\d','bit 100082')

if match:

print(match.group(0))                                            #然而並看不懂這是什麼操作

re.match(pattern,string,flags=0)   從乙個字串的開始位置起匹配正規表示式 返回match物件

pattern:正規表示式的字串或者原生字串表示

string 待匹配的字串

flags  正規表示式使用時的控制標記 

re.findall(pattern,string,flags=0)  搜尋字串,以列表型別返回全部能匹配的字串  裡面的引數有search 和match是一樣的 ,但是要注意search 和 match返回的都是match型別   而 findall返回的確是列表型別

re.split(pattern,string,maxsplit,flags=0) 將乙個字串按照正規表示式匹配結果進行分割,返回列表型別

maxsplit表示最大分割數 就是分成幾部分 就是把後面的字串中與正規表示式匹配的部分去掉,其他的進行分割

加入maxsplit引數 就會 考慮分成幾部分

比如這裡就是只匹配第乙個,其他的作為乙個整體列印出來

re.finditer(pattern,string,flags=0)  搜尋字串,返回乙個匹配結果的迭代型別,每個迭代元素都是match物件

在乙個字串中替換所有匹配正規表示式的字串 返回替換後的字串

pat=re.compile(r'[1-9]\d')     pat  才是乙個正規表示式

rst=pat.search('bit 239849')

recompile(pattern,flags)  pattern 正規表示式的字串或者原生字串物件 他才是真正的正規表示式 他可以直接呼叫re的六個函式『

經過conpile以後的物件就可以使用正規表示式的方法 與re庫提供的六個方法是一樣的

re.findall(r'[1-9]\d','xuanxuan928344 keke394389')』會返回乙個列表型別

re.finditer() 是返回乙個迭代型別 需要結合for迴圈來進行

for match  in re.finditer(r'[1-9]\d','xuanxuan934839 keke739456'):

if match:

print(match.group(0))

就會輸出: 

934839 

739456

而不是乙個列表list的!!!

Python之網路爬蟲學習筆記

大資料時代資料獲取的方式 1 企業生產的使用者資料 大型網際網路公司有海量使用者,所以他們積累資料有天然的優勢 有資料意識的中小企業,也開始積累資料。2 資料管理諮詢公司 通常這樣的公司有很龐大的資料採集團隊,一般會通過市場調研 問卷調查 固定的樣本檢測和各行各業的公司進行合作 專家對話 資料積累很...

網路爬蟲 python學習筆記

pip install requestsr requests.get url r requests.get url,params none,kwargs request其實只有乙個方法 request 有兩個物件 import request r requests.get print r.statu...

python網路爬蟲學習筆記

爬取網頁的通用 框架 網路爬蟲的盜亦有道 requests爬取例項 自動爬取html頁面 自動網路請求提交 主要方法 說明requests.request 構造乙個請求 requests.get 獲取html網頁的主要方法,對應於http的get requests.head 獲取html網頁頭資訊的...