python爬蟲(四)--pythonRegex

來源:互聯網
上載者:User

標籤:python   Regex   re   

在爬蟲的學習過程中,又一個你必須要掌握的知識點就是Regex
爬蟲程式需要爬取你需要的東西,那麼就對爬取的結果進行篩選,Regex就起到這樣的作用
如果你學過任何一門語言,相信你都會接觸Regex。並且Regex大多相同。
不管怎樣,就像開頭說的那樣,因為這是爬蟲基礎教程。所以這篇文章要詳細的說一下python的
Regex。開始進入正題吧。
Regex是一個特殊的字元序列,它能協助你方便的檢查一個字串是否與某種模式比對。Python 自1.5版本起增加了re 模組,它提供 Perl 風格的Regex模式。
re 模組使 Python 語言擁有全部的Regex功能。
compile 函數根據一個模式字串和可選的標誌參數產生一個Regex對象。該對象擁有一系列方法用於Regex匹配和替換。
re 模組也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字串做為它們的第一個參數。


首先第一步,看Regex模式
模式字串使用特殊的文法來表示一個Regex:
字母和數字表示他們自身,一個Regex模式中的字母和數字匹配同樣的字串。下面說一些模式
1.1
^ --匹配字串的開頭,在多行模式中匹配每一行的開頭
執行個體:
import re
value = "hello python"
value_last = re.match(r‘^hello‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 5), match=‘hello‘>


如果換成這樣呢:
import re
value = "hello python"
value_last = re.match(r‘^python‘,value)
print(value_last)
輸出的結果是:
None


1.2
$ --匹配字串的末尾,在多行模式中匹配每一行的結尾
這個和1.1的用法相同這裡不再舉例


1.3
.       --匹配任一字元,除了分行符號,當re.DOTALL標記被指定時,則可以匹配包括分行符號的任一字元
怎麼用?看執行個體:
import re
value = "hello python"
value_last = re.match(r‘^.ello‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 5), match=‘hello‘>


你也可以這樣:
import re
value = "hello python"
value_last = re.match(r‘^.ello.......‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 12), match=‘hello python‘>
好調皮的說。


1.4
\ --逸出字元,使後一個字元改變原來的意思
什麼意思呢?比如1.3的"."本來表示匹配任意一個字元,但是如果加上"\"則表示匹配的就是小數點"."
如果仍然聽不懂那麼看例子:
首先嘗試在1.3的例子上把.前面加上\
import re
value = "hello python"
value_last = re.match(r‘^\.ello‘,value)
print(value_last)
輸出的結果是:
None


但是如果是這樣,我們修改一下value的值
value = ".hello"
這時候你需要去匹配".",怎麼匹配呢?也許你會說用"."但是如果是"*"呢?
value = re.match(r‘^\..ello‘,value)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 6), match=‘.hello‘>
我希望你是瞭解上一個運算式的。


1.5
[...] --字元集,對應的位置可以是字元集中任一字元。字元集中的字元可以逐個列出,也可以給出範圍
,如[abc]或者[a-c],如果第一個字元是^表示取反,如[^abc]表示不是abc的其它字元
,所有特殊字元在字元集中都失去其原有含義。表示一組字元,單獨列出:[abc]匹配‘a‘,‘b‘,‘c‘。


import re 
value = "hello"
value_last = re.match(r‘^h.[a-z][^abce]‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 4), match=‘hell‘>


1.6
* --匹配前一個字元0或者無限次
就是這個意思:
import re 
value = "heo"
value_last = re.match(r‘hel*o‘,value)
print(value_last)
你看,雖然運算式沒有l但是我沒在意加了l但是不可以刪除,俺麼我只好用*之前說了可以匹配前一個字元0次


那麼我要這樣寫
value = ‘value_last = re.match(r‘hel*o‘,value)‘
value_last = re.match(r‘hel*o‘,value)
結果你應該也能想到吧,沒錯:<_sre.SRE_Match object; span=(0, 11), match=‘hellllllllo‘>


1.7
+ --匹配前一個字元1次或者無限次,就是比*大一咯,不用舉例了吧


1.8
? --匹配前一個字元0次或者一次,這個也不用多說了


1.9
{m} --匹配前一個字元m次


1.11
{m,n} --匹配前一個字元m到n次以上幾個不用多說吧!如果不懂那你就從頭學起吧!


1.12
a|b --匹配a或者b
import re 
value = "hellllllllo"
value_last = re.match(r‘h|e‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 1), match=‘h‘>


1.13
(...) --匹配括弧內的運算式,也表示一個組
看到1.12的例子,你會不會問,如果在1.12的基礎撒謊那個,像匹配he怎麼辦,當然python會幫你解決這個問題
import re 
value = "heeho"
value_last = re.match(r‘(h|e){2,}‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 4), match=‘heeh‘>


1.14
(?:re) --類似(...)但是不表示一個組


1.15
再繼續說特殊構造之前,先要說一下Regex的修飾符 - 可選標誌
Regex可以包含一些可選標誌修飾符來控制匹配的模式,修飾符被指定為一個可選標誌,多個標誌可以通過
按位OR(|)它們來指定,如re.I|re.M,被設定成I,M標誌:
re.I--使匹配對大小寫不敏感
re.L--使本地化識別(locale-aware)匹配
re.M--多行匹配,影響^和$
re.S--使"."匹配包括換行在內的所有字元
re.U--根據Unicode字元集解析字元,這個標誌影響\w,\W,\b,\B
re.X--該標誌通過給予你更加靈活的格式以便你將Regex寫的更易於理解。


1.16
說完了可選標誌,讓我們繼續往下學習
(?imx) --Regex包含三種可選標誌:i,m,x。隻影響括弧中的地區
看一個執行個體:
import re
value = "Hello"
value_last = re.match(r‘(?i)hello‘,value)
print(value_last)
輸出的結果是:
<_sre.SRE_Match object; span=(0, 5), match=‘hello‘>


1.17
(?#...) --將後面的內容當作注釋忽視掉


1.18
(?=...) --之後的字串內容需要匹配運算式才能成功匹配。
看具體例子:
import re
value = "Hello"
value_last = re.match(r‘(?i)h(?=[a-b])‘,value)
print(value_last)
這種情況下,由於h後面的"e"不是在a-b範圍內,因此之後的字串內容不匹配運算式,這樣
儘管(?i)h匹配H,還是不能匹配。
因此輸出的結果是:None


import re
value = "Hello"
value_last = re.match(r‘(?i)h(?=[a-z])‘,value)
print(value_last)
這種情況下,"e"屬於a-z,匹配運算式,因此輸出的結果是:H


1.19
(?!...) --之後的字串需要不匹配運算式才能成功


1.20
(?<=...) --之前的字串需要匹配運算式才能成功


1.21
(?<!...) --之前的字串需要不匹配運算式才能成功


1.22
看完上面的1.1到1.21相信Regex的匹配模式你已經掌握差不多了。再來看一些簡單的匹配模式
\d --匹配數字,等價於[0-9]
\D --匹配非數字,等價於[^\d]
\s --匹配空白字元,等價於[\t\r\n\f\v]
\S --匹配非空白字元,等價於[^\s]
\w --匹配單詞字元,等價於[A-Za-z0-9]
\W --匹配非單詞字元,等價於[^\w]


\A --匹配字串開始
\Z --匹配字串結束,如果存在換行,只匹配到換行前的結束字串
\z --匹配字串結束
\G --匹配最後匹配完成的位置
\b --匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b‘ 可以匹配"never" 中的 ‘er‘,但不能匹配 "verb" 中的 ‘er‘。
\B --匹配非單詞邊界。‘er\B‘ 能匹配 "verb" 中的 ‘er‘,但不能匹配 "never" 中的 ‘er‘。
\n, \t, --匹配一個分行符號。匹配一個定位字元。等
\1...\9 --匹配第n個分組的子運算式。




好了,說完了python中的匹配模式,下面該介紹pythonRegex中常用的函數了
1.1
首先第一個函數就是剛剛在執行個體中一直用到的
re.match() --嘗試從字串的開始匹配一個模式
文法:re.match(pattern,string,flags=0)
pattern是要匹配的Regex,string是要匹配的字串,flags標誌位,用於控制Regex的匹配方式
如果匹配成功的話返回一個匹配的對象,否則返回None
可以用group(num)或者groups()匹配對象函數來擷取匹配運算式
group(num = 0)匹配整個運算式的字串,group()可以一次輸入多個組號,這種輕情況下,它將返回一個包含哪些組所對應值的元組
groups()返回一個包含所有小組字串的元組,從1到所含的小組號
import re
value = "hello world,2015!"
value_last = re.match(r‘(^[a-z]*)\s(\w*),(\d*.)‘,value)
if value_last:
print(value_last.group())
print(value_last.group(1))
print(value_last.group(2))
print(value_last.group(3))
輸出的結果是:
hello world,2015!
hello
world
2015!


1.2
re.search() --會在字串內尋找模式比對,直到找到第一個匹配
re.search(pattern.string,flags = 0)
與match相同。


兩者的區別在於:
re.match只匹配字串的開始,如果字串開始不負責Regex,則匹配失敗,函數返回None,
但是re.search()匹配整個字串,直到找到一個匹配
import re
value = "hello world,2015!"
value_last = re.match(r‘2015‘,value)
if value_last:
print(‘match-->‘,value_last.group())
else:
print("No match!")
value_end = re.search(r‘2015‘,value)
print(‘search-->‘,value_end.group())
輸出的結果是:
No match!
search--> 2015


1.3
sub(pattern,repl,string,max=0)
替換字串的匹配項
import re
phone = "2015-5-31 # This is my Num"
num = re.sub(r‘#.*$‘,"",phone)
print("Phone Num:",num)
num = re.sub(r‘\D‘,"",phone)
print("Phone Num:",num)
輸出的結果是:
Phone Num: 2015-5-31 
Phone Num: 2015531


1.4
split(pattern,string[,maxsplit])
按照能夠匹配的字串將string分割後返回列表,maxsplit指定最大分割次數
import re


value = "1.one2.two3.three"
value_last = re.split(r‘\d.‘,value)
print(value_last)
輸出的結果是:
[‘‘, ‘one‘, ‘two‘, ‘three‘]


1.5
findall(pattern.string[,flags])
搜尋string,以列表形式返回全部能匹配的子串
import re


value = "1.one2.two3.three"
value_last = re.findall(r‘\d.‘,value)
print(value_last)
返回的結果是:
[‘1.‘, ‘2.‘, ‘3.‘]


1.6
finditer(pattern,string[,flags])
返回一個能順序訪問的迭代器
import re
value = "1.one2.two3.three"
value_last = re.finditer(r‘\d.‘,value)
for x in value_last:
print(x.group())
返回的結果是:
1.
2.
3.
如果你對迭代器不瞭解的話請翻閱我之前的部落格。




Regex的就到這邊,Regex需要自己經常聯絡,有了這三篇的基礎
set(),deque,Regex,下一篇我們就能詳細的介紹怎麼去寫爬蟲程式了。


鐘志遠  江蘇南京  904727147

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

python爬蟲(四)--pythonRegex

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.