re模組包含對 正規表示式。本章會對
re模組主要特徵和正規表示式進行介紹。
什麼是正規表示式
正規表示式是可以匹配文字片段的模式。最簡單的正規表示式就是普通字串,可以匹配其自身。換包話說,正規表示式』python』 可以匹配字串』python』 。你可以用這種匹配行為搜尋文字中的模式,並且用計算後有值併發特定模式,或都將文字進行分段。
** 萬用字元
正規表示式可以匹配多於乙個的字串,你可以使用一些特殊字元建立這類模式。比如點號(.
)可以匹配任何字元。在我們用
window
搜尋時用問號(?)匹配任意一位字元,作用是一樣的。那麼這類符號就叫 萬用字元。
** 對特殊字元進行轉義
通過上面的方法,假如我們要匹配「python.org
」,直接用用『
python.org
』可以麼?這麼做可以,但這樣也會匹配「
pythonzorg
」,這可不是所期望的結果。
好吧!我們需要對它進行轉義,可以在它前面加上發斜線。因此,本例中可以使用「python\\.org
」,這樣就只會匹配「
python.org
」了。
** 字符集
我們可以使用中括號([ ]
)括住字串來建立字符集。可以使用範圍,比如『
[a-z]
』能夠匹配a到
z的任意乙個字元,還可以通過乙個接乙個的方式將範圍聯合起來使用,比如『
[a-za-z0-9]
』能夠匹配任意大小寫字母和數字。
反轉字符集,可以在開頭使用^
字元,比如『
[^abc]
』可以匹配任何除了a、
b、c之外的字元。
** 選擇符
有時候只想匹配字串』python』 和 』perl』 ,可以使用選擇項的特殊字元:管道符號(|
) 。因此, 所需模式可以寫成』python|perl』 。
** 子模式
但是,有些時候不需要對整個模式使用選擇符---
只是模式的一部分。這時可以使用圓括號起需要的部分,或稱子模式。 前例可以寫成 『p(ython | erl)』
** 可選項
在子模式後面加上問號,它就變成了可選項。它可能出現在匹配字串,但並非必須的。
r』(heep://)?(www\.)?python\.org』
只能匹配下列字元:『『
『www.python.org』
『python.org』
**重複子模式
(pattern)* : 允許模式重複
0次或多次
(pattern)+ : 允許模式重複
1次或多次
(pattern) : 允許模式重複
m~ n 次
例如:r』w * \.python\.org』 匹配 『www.python.org』 、』.python.org』 、』wwwwwww.python.org』
r』w + \.python\.org』 匹配 『w.python.org』 ;但不能匹配 』.python.org』
r』w \.python\.org』 只能匹配『www.python.org』 和『wwww.python.org』
re模組的內容
re模組中一些重要的函式:
re.compile 將正規表示式轉換為模式物件,可以實現更有效率的匹配。
re.search 會在給定字串中尋找第乙個匹配給正則表式的子字串。找到函式返回
matchobject(
值為true)
,否則返回
none(
值為false)
。因為返回值的性質,所以該函式可以用在條件語句中:
if re.serch(pat, string):
print 『found it !』
re.math 會在給定字串的開頭匹配正規表示式。因此,
re.math(『p』 , 『python』)返回真,
re.math(『p』 , 『www.python』) 則返回假。
re.split 會根據模式的匹配項來分割字串。
>>> importre. findall以列表形式返回給定模式的所有匹配項。比如,要在字串中查詢所有單詞,可以像下面這麼做:re>>> some_text = '
alpha , beta ,,,gamma delta
'>>> re.split('
[,]+
',some_text)['
alpha
', '
beta
', '
gamma delta
']
>>> importre.sub的作用在於:使用給定的替換內容將匹配模式的子符串(最左端並且重疊子字串)替換掉。re>>> pat = '
[a-za-z]+
'>>> text = '
"hm...err -- are you sure?" he said, sounding insecure.
'>>>re.findall(pat,text)['
hm', '
err', '
are', '
you', '
sure
', '
he', '
said
', '
sounding
', '
insecure
']
>>> importre.escape 函式,可以對字串中所有可能被解釋為正則運算子的字元進行轉義的應用函式。re>>> pat = '
'>>> text = '
dear ...
'>>> re.sub(pat, '
mr. gumby
',text)
'dear mr. gumby...
'
如果字串很長且包含很多特殊字元,而你又不想輸入一大堆反斜線,可以使用這個函式:
>>> re.escape('匹配物件和組簡單來說,組就是放置在圓括號裡內的子模組,組的序號取決於它左側的括號數。組0www.python.org')
'www\\.python\\.org
'>>> re.escape('
but where is the ambiguity?')
'but\\ where\\ is\\ the\\ ambiguity\\?
'
就是整個模組,所以在下面的模式中:
『there (was a (wee) (cooper)) who (lived in fyfe)』
包含組有:
0 there was a wee cooper who lived in fyfe
1 was a wee cooper
2 wee
3 cooper
4 lived in fyfe
re 匹配物件的重要方法
下面看例項:
>>> importgroup方法返回模式中與給定組匹配的字串,如果沒有組號,預設為re>>> m = re.match(r'
www\.(.*)\..
','www.python.org')
>>>m.group()
'www.python.org
'>>>m.group(0)
'www.python.org
'>>> m.group(1)
'python
'>>> m.start(1)
4>>> m.end(1)
10>>> m.span(1)
(4, 10)
0 ;如上面:m.group()==m.group(0) ;如果給定乙個組號,會返回單個字串。
start 方法返回給定組匹配項的開始索引,
end方法返回給定組匹配項的結束索引加1;
span以元組(
start
,end
)的形式返回給組的開始和結束位置的索引。
----------------------------
正規表示式應該是不容易理解的乙個知識點;python沒意思的基礎終於學完了。雖然學的不紮實,但大體有了個印象;後面的將會非常有意思,讀取檔案,編寫圖形視窗,連線資料庫,web程式設計....
Python學習筆記(十三) 模組基礎
以mark lutz著的 python學習手冊 為教程,每天花1個小時左右時間學習,爭取兩周完成。寫在前面的話 2013 7 22 22 00 學習筆記 1,每乙個python檔案都是乙個模組。模組將變數名封裝進了自包含的軟體包,這一點可以避免變數名的衝突。2,匯入模組不同於c語言中的 includ...
Python學習筆記(十三)
模組包 if name main 軟體目錄結構規範 作業 atm 購物 程式 import 語句 import module1 module2 modulen 當我們使用import語句的時候,python直譯器通過自己的搜尋路徑 存在sys.path裡 進行搜尋from import 語句 fro...
Python學習筆記(十三) 類
本節主要對python中類的概念進行介紹。類完全由物件導向概念所引出。定義乙個類 class people 幫助資訊 number 100 建構函式,初始化方法,當建立乙個類的時候,首先會呼叫它 def init self,name,age self.name name self.age age d...