1. 程式人生 > 其它 >爬蟲從入門到入獄(1)——正則表示式

爬蟲從入門到入獄(1)——正則表示式

文章內容均出自《python爬蟲開發》
文章目錄
1.1正則表示式
1.2正則表示式的基本符號
1.2.1 點號 “ . ”
1.2.2 星號 “ * ”
1.2.3 點號+星號 “ .* ”
1.2.4 問號“ ? ”
1.2.5 點號+星號+問號“ .*?” (最常用)
1.2.6 小括號“()”
1.2.7 反斜槓 “ \ ”
1.2.8 數字 “ \d”
1.3 使用正則表示式
1.3.1 findall 方法
1.3.2 search 方法
1.3.3 compile 方法
1.4 正則表示式的提取技巧
1.4.1 先抓大後抓小:二次提取
1.4.2 括號裡括號外
1.1正則表示式
正則表示式(Regular Expression)是一段字串,它可以表示一段有規律的資訊。Python自帶一個正則表示式模組,通過這個模組可以查詢、提取、替換一段有規律的資訊。在一萬個人裡面找一個人很困難,但是在一萬個人裡面找一個非常“有特點”的人卻很容易。假設有一個人,面板是綠色的,身高三米,那麼即使這個人混在一萬人中,其他人也能一眼找到他。這個“尋找”的過程,在正則表示式中叫作“匹配”。在程式開發中,要讓計算機程式從一大段文字中找到需要的內容,就可以使用正則表示式來實現。使用正則表示式有如下步驟。
(1)尋找規律。
(2)使用正則符號表示規律。
(3)提取資訊。

1.2正則表示式的基本符號
1.2.1 點號 “ . ”
一個點號可以代替除了換行符以外的任何一個字元,包括但不限於英文字母、數字、漢字、英文標點符號和中文標點符號。

1.2.2 星號 “ * ”
一個星號可以表示它前面的一個子表示式(普通字元、另一個或幾個正則表示式符號)0次到無限次。


如上均可以:(星號表示的是前面的一個表示式)


1.2.3 點號+星號 “ .* ”
點號表示任意非換行符的字元,星號表示匹配它前面的字元0次或者任意多次。所以“.*”表示匹配一串任意長度的字串任意次。

如上均可以:
它表示在“如”和“哈”中間出現“任意多個除了換行符以外的任意字元”。


1.2.4 問號“ ? ”
問號表示它前面的子表示式0次或者1次。注意,這裡的問號是英文問號
如上均可以:

1.2.5 點號+星號+問號“ .*?” (最常用)
結合後用法:

如上均可以:

注:“ .*?” 與“ .* ”的區別
.*?的意思就是匹配一個能滿足要求的最短字串。
一句話總結如下。
①“.*”:貪婪模式,獲取最長的滿足條件的字串。
②“.*? ”:非貪婪模式,獲取最短的能滿足條件的字串。

1.2.6 小括號“()”
從一段字串中“提取”出一部分的內容.
有如下一個字串:

可以看出,這裡的密碼左邊有一個英文冒號,右邊有一個漢字“你”。當構造一個正則表示式:.*?你時,得到的結果將會是:

然而,冒號和漢字“你”並不是密碼的一部分,如果只想要“12345abcde”,就需要使用括號:

得到:


1.2.7 反斜槓 “ \ ”
在正則表示式裡面,很多符號都是有特殊意義的,例如問號、星號、大括號、中括號和小括號。反斜槓需要和其他的字元配合使用來把特殊符號變成普通符號,把普通符號變成特殊符號。


1.2.8 數字 “ \d”
正則表示式裡面使用“\d”來表示一位數字。
如果要提取兩個數字,可以使用\d\d;如果要提取3個數字,可以使用\d\d\d。但是如果不知道這個數有多少位怎麼辦呢?就需要用*號來表示一個任意位數的數字。


全部都可以使用下面這個正則表示式來表示:


1.3 使用正則表示式
Python的正則表示式模組名字為“re”,也就是“regular expression”的首字母縮寫。在Python中需要首先匯入這個模組再進行使用。匯入的語句為:

import re
1
1.3.1 findall 方法
Python的正則表示式模組包含一個findall方法,它能夠以列表的形式返回所有滿足要求的字串。
findall的函式原型為:

re.findall(pattern,string,flags=0)
1
pattern表示正則表示式,string表示原來的字串,flags表示一些特殊功能的標誌。findall的結果是一個列表,包含了所有的匹配到的結果。如果沒有匹配到結果,就會返回空列表。

當需要提取某些內容的時候,使用小括號將這些內容括起來,這樣才不會得到不相干的資訊。如果包含多個“(.*? )”怎麼返回呢?如圖3-2所示,返回的仍然是一個列表,但是列表裡面的元素變為了元組,元組裡面的第1個元素是賬號,第2個元素為密碼。


函式原型中有一個flags引數。這個引數是可以省略的。當不省略的時候,具有一些輔助功能,例如忽略大小寫、忽略換行符等。
這裡以忽略換行符為例來進行說明要忽略換行符,就需要使用到“re.S”這個flag。
雖然說匹配到的結果中出現了“\n”這個符號,不過總比什麼都得不到強。內容裡面的換行符在後期清洗資料的時候把它替換掉即可。

1.3.2 search 方法
search()的用法和findall()的用法一樣,但是search()只會返回第1個滿足要求的字串。一旦找到符合要求的內容,它就會停止查詢。對於從超級大的文本里面只找第1個數據特別有用,可以大大提高程式的執行效率。

search()的函式原型為:
對於結果,如果匹配成功,則是一個正則表示式的物件;如果沒有匹配到任何資料,就是None。

如果需要得到匹配到的結果,則需要通過.group()這個方法來獲取裡面的值。

只有在.group()裡面的引數為1的時候,才會把正則表示式裡面的括號中的結果打印出來。

.group()的引數最大不能超過正則表示式裡面括號的個數。引數為1表示讀取第1個括號中的內容,引數為2表示讀取第2個括號中的內容,以此類推。
(注意圖裡的不是findall)


1.3.3 compile 方法
re.findall()自帶re.compile()的功能,所以沒有必要使用re.compile()。

1.4 正則表示式的提取技巧
1.4.1 先抓大後抓小:二次提取


1.4.2 括號裡括號外
括號內可以有其他字元。
具體影響見下圖。

如果括號裡面有其他普通字元,那麼這些普通字元就會出現在獲取的結果裡面。
————————————————
版權宣告:本文為CSDN博主「流鼻涕不用抽紙」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/weixin_55159605/article/details/124085670