爬蟲必學知識之正則表達式上篇

這是平常學python的第12篇文章
php


在向網頁進行了提交請求之類的以後,咱們能夠獲得了網頁的返回內容,裏面天然而然會有咱們想要的數據,可是html元素文本這麼多,咱們不可能一 一去找咱們須要的數據,這時就須要用到正則表達式了,正則表達式是學爬蟲必須學的內容,並且不止python能夠用,java等其餘語言均可以用,因此學了好處大大。html


什麼是正則表達式?java


正則表達式就是一個特殊的字符序列,能夠用於檢測一個字符串是否與咱們的所設定的字符串相匹配。功能有快速檢索文本和快速替換一些文本的操做。python


python裏面有個處理正則表達式的庫 re。有個方法正則表達式


findall(pattern,string,flags)app


用來匹配正則達式,咱們就先用這個方法處理下。python爬蟲

參數以下:url


  • pattern:正則表達式spa

  • string:要進行匹配的字符串3d

  • flags:匹配的模式

結果是一個匹配內容的列表


'\d' : 這個表示匹配單個0-9數字

'\D' : 與\d相反,匹配數字之外的內容

用代碼來感覺下:

import re#這個庫是用來使用正則表達式的
a='sg+sga5g45gaae3f23hgt13'
r=re.findall('\d',a)#這個就是根據\d的正則表達式來查找對應字符,其中\d是對應0-9的數字
#查找非數字用\D
r1=re.findall('\D',a)
print(r)
print(r1)
#結果
['5', '4', '5', '3', '2', '3', '1', '3']
['s', 'g', '+', 's', 'g', 'a', 'g', 'g', 'a', 'a', 'e', 'f', 'h', 'g', 't']
複製代碼


能夠看到找出了字符串中的數字和非數字


若是咱們在匹配一個字符串時,中間內容是有多個變化的,咱們須要應變多種不一樣的字符,如這個字符串

a='abc,acc,agc,anc,afc,adc,aec'
複製代碼

若是須要匹配這個字符串時,咱們就須要用到 [ ] ,用中括號括起來的字符,裏面的內容表示或關係,那來看看代碼

import re
a='abc,acc,agc,anc,afc,adc,aec'
#如今查找上面的中間字符爲c或者f的字符串
#這個要求能夠用到字符集來實現
r=re.findall('a[cf]c',a)#[]表示字符集,裏面的內容是或關係
# 結果
['acc', 'afc']
複製代碼


上面匹配了中間字符是c或者是f的字符串,匹配中間字符非c和非f,能夠在前面加個 ^ 符號

import re
r=re.findall('a[……cf]c',a)#[c-f]就是表示從c到f
print(r)
# 結果
['abc', 'agc', 'anc', 'adc', 'aec']
複製代碼



上面只處理了中間字符爲chu者f的字符串,可是沒有匹配所有的,若要匹配所有,能夠加個 - 符號,表示範圍,以下

import re
r=re.findall('a[b-n]c',a)#[c-f]就是表示從c到f
print(r)
# 結果
['abc', 'acc', 'agc', 'anc', 'afc', 'adc', 'aec']
複製代碼


[b-n]:這個就是表示b到n的字符


匹配漢字:[\u4E00-\u9FA5]



歸納字符集:

用一個 \ + 字母 表示一系列的字符的元字符,只能匹配單個字符,經常使用的以下


  • \w匹配數字和字符「不包括&符號」只匹配單詞,數字和下劃線

  • \W:與\w相反,這個包括空格和回車

  • \s:匹配空格字符,如空格,回車和製表符

  • \S:與\s相反

  • .:匹配除換行符以外的其餘字符

  • 還有前面的\d\D也是


有個小技巧:若是想要匹配全部字符,就能夠把上面的兩個相反的合併起來就能夠了。


代碼以下:

#歸納字符集,就是用一個\加個字母來表示一類字符,好比剛開始的\d,\D
import re
a='hdsk\n122\rs3$ dkl%df36\t5&'
r=re.findall('\w',a)#這個是匹配數字和單詞
print(r)
#也能夠匹配非數字非單詞
r=re.findall('\W',a)
print(r)
#匹配空格字符和製表符等其餘字符
r=re.findall('\s',a)
print(r)
#匹配除換行符以外的其餘字符
r=re.findall('.',a)
print(r)
# 結果
['h', 'd', 's', 'k', '1', '2', '2', 's', '3', 'd', 'k', 'l', 'd', 'f', '3', '6', '5']
['\n', '\r', '$', ' ', '%', '\t', '&']
['\n', '\r', ' ', '\t']
['h', 'd', 's', 'k', '1', '2', '2', '\r', 's', '3', '$', ' ', 'd', 'k', 'l', '%', 'd', 'f', '3', '6', '\t', '5', '&']
複製代碼



數量詞:

當一個字符須要連續重複匹配屢次時,就要用到這個。如匹配三個字符組成的字符串:

[a-zA-z]{3} ,大括號裏面的表示重複次數。

若要匹配三到六個字符,大括號的就須要這樣寫:{3,6}.

代碼以下;

#數量詞,當一個字符須要屢次重複匹配時就須要用到
import re
a='python java111php23 html'
r=re.findall('[a-z]{3}',a)#重複屢次就用大括號,括號內的數表示重複的次數
print(r)
#也能夠重複一個範圍,表示匹配3到6個字符
r=re.findall('[a-z]{3,6}',a)
print(r)#這樣就能夠把單詞都找出來了
# 結果
['pyt', 'hon', 'jav', 'php', 'htm']
['python', 'java', 'php', 'html']
複製代碼


其餘數量詞表示:

  • * :匹配零次或無限屢次

  • +:匹配一次或以上

  • ?:匹配零次或者一次


a='pytho243python34pythonn'
#*表示匹配對應內容0次或者無限次
r=re.findall('python*',a)#這個就是表明對n字符的數量詞匹配
print(r)
#+表示匹配內容1次或者無限次
r=re.findall('python+',a)
print(r)
#?表示能夠匹配0次或者1次,注意這個?和上面的非貪婪表明的意思不同
r=re.findall('python?',a)
print(r)
# 結果
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['pytho', 'python', 'python']
複製代碼


貪婪匹配:正則表達式默認爲貪婪匹配,即匹配符合字符串的最大長度,如上面的[a-zA-z]{3,6},他會趨於匹配長度爲6的字符串,匹配到條件不知足時才中止匹配。

非貪婪匹配:就是趨於匹配長度最小的字符串,匹配知足第一個條件就會中止匹配

r=re.findall('[a-z]{3,6}',a)# 貪婪匹配
print(r)
r=re.findall('[a-z]{3,6}?',a)
print(r)#因爲是非貪婪,因此匹配當第一個條件知足時就中止匹配
# 結果
['python', 'java', 'php', 'html']
['pyt', 'hon', 'jav', 'php', 'htm']
複製代碼


END

這篇文章只是介紹了下正則表達式的簡單用法,能夠用來入門正則,下一篇文章講正則表達式高級點的用法。




留個小練習:寫一個正則來匹配生日,字符串爲:

  • 2005-06-09

  • 2005-6-9

  • 2005 6 9

  • 2005,06,09

能夠把答案寫在留言區哈!


上述文章若有錯誤歡迎在留言區指出,若是這篇文章對你有用,點個贊,轉個發如何?



MORE
延伸閱讀

◐◑python爬蟲經常使用庫之requests詳解

◐◑ python使用requests+re簡單入門爬蟲

◐◑python爬蟲經常使用庫之urllib詳解



1803114089.png


平常學python

代碼不止bug,還有美和樂趣

相關文章
相關標籤/搜索