python3 爬虫第三步 本文包你学会正则 不会就来锤我
簡介
正則表達式是一種描述字符的一種方式,通過該方式,匹配字符串。
正則表達式是自由的,一個字符的含義往往代表著一類字符,通過多個正則正則符號的組合描述,可以使組成的正則表達式能夠描述一類字符串。
在開發中,很多時候使用正則表達式描述一類字符串。
注:正則在編程中是通用的
在python中,使用re模塊的match方法進行字符串與正則的匹配。語法如下:
re.match(pattern, string, flags=0)- pattern:正則表達式
- string:需要進行匹配的字符串
- flags:正則表達式的匹配方式
匹配成功返回匹配的對象,否則返回None。
正則基本使用
最簡單的硬匹配
使用re模塊前必須引入re,隨后使用match方法進行正則匹配:
以上代碼正則區域進行了比較硬核的匹配,直接用 這是正則區域 作為正則匹配,字符串內容也是 這是正則區域。匹配完后把匹配結果賦給res 變量,隨后使用print輸出(group方法會可以提取數據)。結果如下:
成功輸出了匹配的內容。
接下來我把 這是正則區域 的字符串內容改為 這是字符串區域:
結果如下:
由于匹配的值為None,所以輸出錯誤。我們可以更改為如下方法:
這個時候就不會報錯了,沒有匹配就不會輸出。
硬核的匹配方式學完了,接下來學一點別的方式。
\d
先介紹一個符號 \d,\d 可以匹配0-9的數字,在代碼中可以寫成如下形式:
import reres = re.match("\d","2") if res:print(res.group())結果如下:
如果后面的字符串為2則會匹配2,如果把2更換成字母則將不會輸出任何值:
結果如下:
我們的代碼還可以更加復雜一點,當然只是一點點不是億點點:
這個時候不管是星期幾,只要是數字都將會輸出顯示:
[]
接下來認識一下[],[]可以匹配方括號中列舉的字符。例如在[]中列舉1234,代碼寫為 [1234],代碼如下:
import reres = re.match("今天星期[0123456789]","今天星期3") if res:print(res.group())以上代碼是否還會匹配成功輸出結果呢?當然是可以的,因為方括號中列舉了0-9這幾個數,并不是一些讀者認為的0123456789是一個整體,這一串數字是以字符單個存在說明,并非整體,所以肯定會匹配成功并且顯示:
以上代碼列舉了0-9這幾個數字,寫太長太過麻煩,可以寫成以下形式,方便快捷且清晰:
如果想列舉字母a-z也沒必要寫太長,例如:
res = re.match("今天星期[a-z]","今天星期t")結果如下:
如果你想大寫也匹配呢?這個很簡單,看如下示例:
因為方括號里面的字符都是單個存在的,a-z描述的是a到z的字母,A-Z描述的是大寫A到Z的字母,是一個整體,所以直接寫成如上方式肯定是沒問題的。
結果如下:
\w 與 \W
\w可以匹配 A-Z、a-z、0-9和下劃線_。
\W可以匹配 非字母、非數字、非下劃線以及非漢字,也就是和 \w反過來。
首先看\w:
由于\w是匹配 A-Z、a-z、0-9和下劃線_所以匹配沒問題,結果如下:
其它匹配將不再列出,都是一個意思。
嘗試\W:
結果ok:
*、+、{}與?
進行到這如果還不增加一點難度想必就無趣了,現在開始使用一些字符對已學的單個字符匹配進行描述,使正則表達式能夠匹配多個字符。
現在有一個字符串 房價租金1999 如何進行正則匹配?查看代碼:
仔細看,正則表達式 房價租金[0-9]*,前面的 房價租金 硬匹配了房價租金這幾個字符串,之后我使用了一個中括號,里面的內容為匹配 0-9 其中任意一個數字,在一般情況下 [0-9] 匹配只能匹配一個,我在方括號后面增加了一個 *號。
*號的作用是描述它前面的一個正則表達式 [0-9] 匹配0次或者無限次,這里出現了1次,則匹配成功。結果如下:
當然0次也可以的,我們把代碼更改為如下:
以上代碼使用*號去匹配1這個字符,如果不存在,正則表達式依舊會返回匹配對象,因為前面已經匹配成功了。*號0次沒有也ok,所以依舊會輸出:
如果把以上代碼中的 * 號改為 + 號會出現什么情況?我們試一下:
這時候將不會輸出。+號表示前面的字符出現1次,為0可不行,那么我們匹配一下 房價租金1111 這個字符串看看效果:
res = re.match("房價租金1+","房價租金111111111")結果如下:
那如果我想匹配固定次數如何?
這個時候就可以使用{}進行限定次數的匹配:
結果為:
當然代碼也可以寫成:
{0,4}中0為匹配的起始位置,4為結束位置,如果4這個結束位置不填,那么將會從0起始位置(其實位置可以寫任意位置,如1,2,3…)匹配到無限次。
^與$
^表示從字符串頭進行匹配,$表示配字符串結束。
現在開始來一個綜合的挑戰,匹配一個郵箱地址吧,這個在正常的需求中也是很常見的:
查看正則我們寫為:^\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,使用 | 符號使左右兩邊連接,隨后進行判斷。這個符號也就是或運算。結果如下:
()圓括號的作用是進行分組:
以上代碼是上一個示例中修改,re_1 的變化不大,使用圓括號為每一個塊的正則分了組。之后使用group的時候傳入參數 0、1、2、3、4 。0表示正則匹配出來的所有結果,1表示 (^\d+) 匹配的結果,2表示 (@qq) 匹配的結果,之后的序號以此類推。結果如下:
爬蟲系列持續更新,歡迎關注、點贊、收藏。
下一篇將使用正則抓取房價。
總結
以上是生活随笔為你收集整理的python3 爬虫第三步 本文包你学会正则 不会就来锤我的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php基础教程 第一步 环境配置及hel
- 下一篇: php基础教程 第二步 通俗易懂的学习变