Python筆記(十):正則表達式

正則表達式對比工具正則表達式

https://pan.baidu.com/s/1XIPyF1vFSj5PACPx9zW8_g函數

(一)      正則表達式符號和特殊字符工具

符號測試

說明spa

示例3d

|code

對象

re1|re2,匹配re1或re2blog

 .ci

匹配任何字符(\n除外)

 

^

匹配字符串開始部分

^ab.*

以ab開始的字符串,匹配ab12三、ababc等等

$

匹配字符串結束部分

.*123$

以123結束的字符串,匹配ab12三、測試123等等

*

匹配0次或屢次前面的正則表達式

.*

匹配0次或屢次前面的 .

+

匹配1次或屢次前面的正則表達式

 

?

匹配0次或1次前面的正則表達式

 

{n}

匹配n次前面的正則表達式

.{5}

 

{m,n}

匹配M到N次前面的正則表達式

.{1,10}

 

[…]

匹配[]裏的任一字符

[abc]d

匹配 ad、bd、cd

[x-y]

匹配範圍內的任一字符

[a-c]d:匹配 ad、bd、cd

[0-9]d:匹配0d、1d、2d、3d等

[^…]

不匹配[]裏的任一字符

[^a-c]d: 不匹配 ad、bd、cd

 

(…)

將正則表達式封閉爲一個組

例如:[a-b][a-b] :只匹配aa、ab等

([a-b][a-b])+:匹配aaaa、abab等.另外能夠用這個()來提取數據

 

符號

說明

示例

\d

匹配任一數字,和[0-9]是同樣的,\D則不匹配任何數字

A\d: 匹配A一、A2等

\w

 

匹配任一數字、字母,和[A-Za-z0-9]是同樣的,\W則相反

 

 

\s

 

匹配任一空格字符,\S

則相反

hello\sword:匹配hello word

\..

將\後一個字符按字面意義匹配,不匹配特殊含義

\?:匹配?

\\d:匹配\d

\b

 

匹配任何單詞邊界(\B

則相反)

例如:字符串 ab the Htherr

the: 能匹配到2個 the

\bthe\b:只匹配第一個 the

\Bthe\B:只匹配第二個 the

\A

 

匹配字符串開始部分,\Z 則字符串結束部分

參照^ 和$

 

(二)      貪婪模式和非貪婪模式

貪婪模式:儘量的匹配

非貪婪模式:匹配到第一個結果後就結束匹配。在*、+、?、{}後面加一個?就是非貪婪模式。(*|+|?|{})?

看下面2張圖就清楚了(藍色背景表示匹配的內容)

第一張圖(貪婪模式):匹配到第一</div>後還會繼續向右匹配。(在內容和正則表達式匹配的狀況下,儘量的匹配最長字符串)

第二張圖(非貪婪模式):匹配到第一個</div>後就結束匹配了。(在內容和正則表達式匹配的狀況下,匹配到第一個結果後就結束匹配)

 

 

 

(三)      re模塊

函數/方法

說明

re.compile(pattern, flags=0)

(預編譯)將正則表達式編譯爲對象(不是必須的,不過通常是會預編譯)

實際應用中:下面2種方式都是能夠用的

the_str=''

第一:
href_regx= re.compile('<div.*</div>')
href_regx.match(the_str)

第二:
re.match('<div.*</div>',the_str)

第一種是調用正則表達式對象的match()方法。

第二種寫法是調用re模塊的match()函數

match(pattern, string)

Pattern:正則表達式

String:字符串

匹配成功,返回字符串,失敗則返回None。

預編譯後的正則表達式對象則只須要傳str就好了(由於它自己就是pattern對象

search(pattern, string)

Pattern:正則表達式

String:字符串

返回第一個匹配內容,沒有匹配則返回None

findall(pattern, string)

 

以列表形式返回全部匹配的內容

finditer(pattern, string)

返回全部匹配的內容,以迭代器的形式

split(pattern, string)

Pattern匹配的內容做爲分隔符,split將字符串分割爲列表並返回

 

flags參數

說明

re.I 
re.IGNORECASE

 

不區分大小寫

re.M

re.MULTILINE

匹配行的開始和結束部分,而不是嚴格匹配字符串自己的開始、結束部分

re.S

re.DOTALL)

 

. (點號)能夠匹配\n

 

 

使用flags參數的時候,不清楚傳第幾個參數的話,最好先去看下方法(函數)的實現代碼。或者直接指定(flags= xxx)

 

(四)      re模塊示例

 1 import re  2 the_str='<div id="hd_info"></div></div></div>'
 3 href_regx= re.compile('<div.*</div>')  4 print('match()示例:',href_regx.match(the_str))  5 print('match()示例:',re.match('<div.*</div>',the_str))  6 print('search()示例:',re.search('/div>',the_str))  7 
 8 print('findall()示例:',re.findall('/div>',the_str))  9 print('finditer()示例:',re.finditer('/div>',the_str)) 10 for i in re.finditer('/div>',the_str): 11     print('迭代finditer()返回值:',i) 12 
13 print('split()示例:',re.split('/.',the_str,re.DOTALL))

 

(五)      正則表達式實際應用

 匹配電信手機號

13三、14九、15三、17三、17七、180、18一、18九、199開頭的11位數字

正則表達式:1(39|49|53|[7][37]|[8][019]|99)[0-9]{8}

 匹配a標籤開始 href屬性值 (<a href='' ) 

相關文章
相關標籤/搜索