python 中 正則表達式(Regular Expressions)學習

剛接觸了python中的re模塊,由於之前沒有對正則表達式進行系統性的學習,學起來很費勁,因此寫下這篇博客進行積累和鞏固,以備後用。

正則表達式的應用是非常廣泛的,不論是在linux中還是在編程中,我們總會遇到正則表達式,藉着學習python的機會,也稍微系統的學習一下正則表達式。

自己看了下正則表達式的幫助文檔,也在Internet上看了一些相關的資料,網上的資料對這個介紹的還是很多的。

以下爲自己的學習經歷:

'*'  這個符號在通配符中是最經常使用的,我們常常用它來匹配任意的字符,在RE中也是如此,'*'表示的是:匹配0個或者多個字符

print(re.match(r'ab*', 'abb').group())

以上例子中,*表示匹配多個b結尾的字符。

'.'  這個符號是dot,點字符,表示的是:匹配任意的字符。

當:

print(re.match(r'.*', 'abc\ndef').group())

表示匹配一行,添加函數 re.DOTALL時,匹配的是整個字符串,多行。

print(re.match(r'.*', 'abc\ndef', re.DOTALL).group())

'+'  表示的是:匹配一個或者多個字符,說明

print(re.match(r'ab+', 'abbbb'))

匹配的是一個或者多個b字符。

'?'  表示:匹配的是0個或者一個字符,說明

print(re.match(r'ab?', 'abbb'))

同樣會匹配上,因爲abbb中包含ab,a

'^'  這個符號是caret,脫字符,表示的是:匹配一行的首字符。

說明:當

print(re.findall(r'^abc', 'abc\nabc',))

匹配的是\n前面的字符串,只返回一個abc,但是如下情況的話:

print(re.findall(r'^abc', 'abc\nabc', re.MULTILINE))

匹配兩個abc字符串,re.MULTILINE函數,顧名思義,我們在匹配時將對多行進行匹配,所以匹配了兩個abc字符。

'$'  這個符號是表示:匹配一行的尾字符。

說明:

print(re.findall(r'abc\d$', 'abc1\nabc3', re.MULTILINE))

當出現re.MULTILINE時,表示匹配多行。

'\'  轉義字符,這個在其他語言和環境中是經常應用的,如果添加轉義的話,纔不會產生歧義。

'[]' 匹配集合符號,表示匹配[]中的字符,說明:

print(re.search(r'0[xX]([0-9a-fA-F]{6})', 'the hex value is 0x2378ad'))

這個語句表示匹配十六進制的數。

'{m}'  表示的是:匹配{}中的m個字符,說明:

print(re.match(r'ab{3,5}', 'abbbbb').group())

表示的是:匹配3-5個b在字符串中,但是python默認會匹配5個,匹配大的個數。(貪婪模式)


說明 re.match() 和 re.search()的區別

#!/usr/bin/python
# -*- coding: UTF-8 -*- 
import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))      # 不在起始位置匹配

返回結果:

(0, 3)
None
#!/usr/bin/python
# -*- coding: UTF-8 -*- 
import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配

返回結果:

(0, 3)
(11, 14)

比較之下可以看出,兩者的區別在於,是否在開始進行匹配,match爲從起始位置進行匹配,而search則是不從開始匹配,(其實理解兩者英文意思也可明白,一個是匹配,一個是搜索)

關於特殊的轉義的說明:


\A

匹配字符串的開始

 

\b

匹配空字符串(匹配位置比較容易理解),但只在單詞的開頭或結尾。(也作爲分割字符串)一個單詞是由字母數字或下劃線字符組成,因此一個單詞的邊界是空白或者非字母 數字、不包括下劃線。請注意,\b是指\w和\W之間的邊界,因此確切的字符集定義取決於UNICODE和LOCALE編譯標誌的值。在字符範圍內,\b 表示退格符,與python的字符串兼容。

 

\B

匹配空字符串(匹配位置比較容易理解),但當它不在單詞的開始或結尾。這是和\b相反的,也受到LOCALE和UNICODE的設置影響。

 

\d

當UNICODE標誌沒有指定,匹配任何10進制數字,相當於[0-9]。帶UNICODE標誌時,它會匹配任何在unicode字符集中屬於數字分類的字符。

 

\D

當UNICODE標誌沒有指定,匹配任何非數字字符,相當於[^0-9]。帶UNICODE標誌時,它會匹配任何不在unicode字符集中屬於數字分類的字符。

 

\s

當LOCALE和UNICODE標誌沒有指定時,匹配任何空白字符,這相當於[ \t\n\r\f\v]。帶LOCALE標誌時,它將匹配當前環境定義的空白符。如果帶UNICODE標誌,那麼將匹配任何被劃分爲空白符的符號。

 

\S

當LOCALE和UNICODE標誌沒有指定時,匹配任何非空白字符,這相當於[^\t\n\r\f\v]。帶LOCALE標誌時,它將匹配當前環境定義的非空白符。如果帶UNICODE標誌,那麼將匹配任何不被劃分爲空白符的符號。

 

\w

當LOCALE和UNICODE標誌沒有指定時,匹配任何字母數字字符、下劃線,這相當於[a-zA-Z0-9_]。帶LOCALE標誌時,它 將匹配當前環境定義的字母和[0-9_]。帶UINCODE標誌時,將匹配在unicode字符集裏劃分爲字母的字符和[0-9_]。

 

\W

當LOCALE和UNICODE標誌沒有指定時,匹配任何非字母數字字符、下劃線,這相當於[^a-zA-Z0-9_]。帶LOCALE標誌 時,它將匹配除了當前環境定義的字母、[0-9_]。帶UINCODE標誌時,將匹配除了在unicode字符集裏劃分爲字母的字符、[0-9_]。

 

\Z

匹配字符串的結束

以上規則比較好記憶,因爲都是兩兩相對應的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章