日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3 爬虫第三步 本文包你学会正则 不会就来锤我

發布時間:2023/12/4 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3 爬虫第三步 本文包你学会正则 不会就来锤我 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

正則表達式是一種描述字符的一種方式,通過該方式,匹配字符串。
正則表達式是自由的,一個字符的含義往往代表著一類字符,通過多個正則正則符號的組合描述,可以使組成的正則表達式能夠描述一類字符串。
在開發中,很多時候使用正則表達式描述一類字符串。
注:正則在編程中是通用的

在python中,使用re模塊的match方法進行字符串與正則的匹配。語法如下:

re.match(pattern, string, flags=0)
  • pattern:正則表達式
  • string:需要進行匹配的字符串
  • flags:正則表達式的匹配方式

匹配成功返回匹配的對象,否則返回None。

正則基本使用

最簡單的硬匹配
使用re模塊前必須引入re,隨后使用match方法進行正則匹配:

import reres = re.match("這是正則區域","這是正則區域") print(res.group())

以上代碼正則區域進行了比較硬核的匹配,直接用 這是正則區域 作為正則匹配,字符串內容也是 這是正則區域。匹配完后把匹配結果賦給res 變量,隨后使用print輸出(group方法會可以提取數據)。結果如下:

成功輸出了匹配的內容。
接下來我把 這是正則區域 的字符串內容改為 這是字符串區域

res = re.match("這是正則區域","這是字符串區域")

結果如下:

由于匹配的值為None,所以輸出錯誤。我們可以更改為如下方法:

import reres = re.match("這是正則區域","這是字符串區域") if res:print(res.group())

這個時候就不會報錯了,沒有匹配就不會輸出。

硬核的匹配方式學完了,接下來學一點別的方式。

\d

先介紹一個符號 \d,\d 可以匹配0-9的數字,在代碼中可以寫成如下形式:

import reres = re.match("\d","2") if res:print(res.group())

結果如下:

如果后面的字符串為2則會匹配2,如果把2更換成字母則將不會輸出任何值:

res = re.match("\d","a")

結果如下:

我們的代碼還可以更加復雜一點,當然只是一點點不是億點點:

res = re.match("今天星期\d","今天星期3")

這個時候不管是星期幾,只要是數字都將會輸出顯示:

[]

接下來認識一下[],[]可以匹配方括號中列舉的字符。例如在[]中列舉1234,代碼寫為 [1234],代碼如下:

import reres = re.match("今天星期[0123456789]","今天星期3") if res:print(res.group())

以上代碼是否還會匹配成功輸出結果呢?當然是可以的,因為方括號中列舉了0-9這幾個數,并不是一些讀者認為的0123456789是一個整體,這一串數字是以字符單個存在說明,并非整體,所以肯定會匹配成功并且顯示:

以上代碼列舉了0-9這幾個數字,寫太長太過麻煩,可以寫成以下形式,方便快捷且清晰:

res = re.match("今天星期[0-9]","今天星期3")

如果想列舉字母a-z也沒必要寫太長,例如:

res = re.match("今天星期[a-z]","今天星期t")

結果如下:

如果你想大寫也匹配呢?這個很簡單,看如下示例:

res = re.match("今天星期[a-zA-Z]","今天星期T")

因為方括號里面的字符都是單個存在的,a-z描述的是a到z的字母,A-Z描述的是大寫A到Z的字母,是一個整體,所以直接寫成如上方式肯定是沒問題的。
結果如下:

\w 與 \W

\w可以匹配 A-Z、a-z、0-9和下劃線_。
\W可以匹配 非字母、非數字、非下劃線以及非漢字,也就是和 \w反過來。
首先看\w:

import reres = re.match("\w","a") if res:print(res.group())

由于\w是匹配 A-Z、a-z、0-9和下劃線_所以匹配沒問題,結果如下:

其它匹配將不再列出,都是一個意思。
嘗試\W:

res = re.match("\W","+")

結果ok:

*、+、{}與?

進行到這如果還不增加一點難度想必就無趣了,現在開始使用一些字符對已學的單個字符匹配進行描述,使正則表達式能夠匹配多個字符。
現在有一個字符串 房價租金1999 如何進行正則匹配?查看代碼:

import reres = re.match(r"房價租金[0-9]*","房價租金1999") if res:print(res.group())

仔細看,正則表達式 房價租金[0-9]*,前面的 房價租金 硬匹配了房價租金這幾個字符串,之后我使用了一個中括號,里面的內容為匹配 0-9 其中任意一個數字,在一般情況下 [0-9] 匹配只能匹配一個,我在方括號后面增加了一個 *號。
*號的作用是描述它前面的一個正則表達式 [0-9] 匹配0次或者無限次,這里出現了1次,則匹配成功。結果如下:

當然0次也可以的,我們把代碼更改為如下:

res = re.match("房價租金1*","房價租金")

以上代碼使用*號去匹配1這個字符,如果不存在,正則表達式依舊會返回匹配對象,因為前面已經匹配成功了。*號0次沒有也ok,所以依舊會輸出:

如果把以上代碼中的 * 號改為 + 號會出現什么情況?我們試一下:

res = re.match("房價租金1+","房價租金")

這時候將不會輸出。+號表示前面的字符出現1次,為0可不行,那么我們匹配一下 房價租金1111 這個字符串看看效果:

res = re.match("房價租金1+","房價租金111111111")

結果如下:

那如果我想匹配固定次數如何?
這個時候就可以使用{}進行限定次數的匹配:

res = re.match("房價租金1{0}","房價租金111111111")

結果為:

當然代碼也可以寫成:

res = re.match("房價租金1{0,4}","房價租金111111111")

{0,4}中0為匹配的起始位置,4為結束位置,如果4這個結束位置不填,那么將會從0起始位置(其實位置可以寫任意位置,如1,2,3…)匹配到無限次。

^與$

^表示從字符串頭進行匹配,$表示配字符串結束。
現在開始來一個綜合的挑戰,匹配一個郵箱地址吧,這個在正常的需求中也是很常見的:

import reres = re.match("^\d+@\w+\.\w+",r"1234567@qq.com") if res:print(res.group())

查看正則我們寫為:^\d+@\w+.\w+
我們分解一下正則表達式的組成:

  • ^\d+:在最開頭使用了一個^描述之后的一個正則描述為字符串開頭。\d為數字,+號為匹配至少一個。連起來就是在字符串開頭匹配一串數字。
  • @\w+:一串數字結束后,硬匹配一個@符號,郵箱都這樣。之后\w表示匹配
    A-Z、a-z、0-9和下劃線_(下劃線我不懂,不過好像我見過有吧),由于郵箱有qq郵箱,163郵箱,谷歌等不同的郵箱,所以我就用\w了。由于匹配的不止一個,所以我用了+號進行之前的正則描述。
  • 、.\w+:最后進行了一個點 . 的硬匹配,在 . 前面加了一個\是因為需要轉義,之后再匹配一個 \w,然后完事。 結果如下:


讀者可以修改一下郵箱即可查看效果。

注意:以上郵箱的匹配形式并不是嚴謹的正則編寫方式,請勿在實際項目中使用,在這里只是為了方便演示,請見諒。

以上的基礎正則基本上在應用開發中已經夠用了,接下來再擴展一下正則表達式的符號。

|與()

| 為一個或運算,|符號左右兩邊的正則都可以進行匹配,只要有一個匹配成功,那么整個正則匹配即為成功:

import rere_1="^\d+@qq\.\w+" re_2="^\d+@163\.\w+"res = re.match(re_1+'|'+re_2,r"1234567@163.com") if res:print(res.group())

在以上代碼中在上一個案例中修改,其中正則不再贅述,畢竟都相差不大。以上代碼中定義了兩個變量 re_1 與 re_2,re_1 為匹配qq郵箱,re_2 為匹配163的郵箱,在進行匹配時,在正則中代碼編寫為 re_1+'|'+re_2,使用 | 符號使左右兩邊連接,隨后進行判斷。這個符號也就是或運算。結果如下:

()圓括號的作用是進行分組:

import rere_1="(^\d+)(@qq)(\.)(\w+)"res = re.match(re_1,r"1234567@qq.com") if res:print("0",res.group(0))print("1",res.group(1))print("2",res.group(2))print("3",res.group(3))print("4",res.group(4))

以上代碼是上一個示例中修改,re_1 的變化不大,使用圓括號為每一個塊的正則分了組。之后使用group的時候傳入參數 0、1、2、3、4 。0表示正則匹配出來的所有結果,1表示 (^\d+) 匹配的結果,2表示 (@qq) 匹配的結果,之后的序號以此類推。結果如下:

爬蟲系列持續更新,歡迎關注、點贊、收藏。
下一篇將使用正則抓取房價。

總結

以上是生活随笔為你收集整理的python3 爬虫第三步 本文包你学会正则 不会就来锤我的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。