python基礎學習筆記(十三)
2013-05-20 23:10 ?蟲師 閱讀( ... ) 評論( ... ) 編輯 收藏?
?
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 ’
只能匹配下列字符:
‘ http://www.python.org ’
‘ http://python.org ’
‘ www.python.org ’
‘ python.org ’
?
** 重復子模式
(pattern)*?:? 允許模式重復 0 次或多次
(pattern)+?:? 允許模式重復 1 次或多次
(pattern){m,n}?:? 允許模式重復 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?{3,4}\.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? 會根據模式的匹配項來分割字符串。
>>> import re >>> some_text = ' alpha , beta ,,,gamma delta ' >>> re.split( ' [,]+ ' ,some_text) [ ' alpha ' , ' beta ' , ' gamma delta ' ]
?
re.?findall 以列表形式返回給定模式的所有匹配項。比如,要在字符串中查找所有單詞,可以像下面這么做:
>>> import 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 ' ]
?
re.sub 的作用在于:使用給定的替換內容將匹配模式的子符串(最左端并且重疊子字符串)替換掉。
>>> import re >>> pat = ' {name} ' >>> text = ' Dear {name}... ' >>> re.sub(pat, ' Mr. Gumby ' ,text) ' Dear Mr. Gumby... '
?
re.escape? 函數,可以對字符串中所有可能被解釋為正則運算符的字符進行轉義的應用函數。
如果字符串很長且包含很多特殊字符,而你又不想輸入一大堆反斜線,可以使用這個函數:
>>> re.escape( ' www.python.org ' ) ' www\\.python\\.org ' >>> re.escape( ' but where is the ambiguity? ' ) ' but\\ where\\ is\\ the\\ ambiguity\\? '
?
?
?
匹配對象和組
?
簡單來說,組就是放置在圓括號里內的子模塊,組的序號取決于它左側的括號數。組 0 就是整個模塊,所以在下面的模式中:
‘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? 匹配對象的重要方法
下面看實例:
>>> import re >>> m = re.match(r ' www\.(.*)\..{3} ' , ' 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)
group 方法返回模式中與給定組匹配的字符串,如果沒有組號,默認為 0? ;如上面: m.group()==m.group(0)?;如果給定一個組號,會返回單個字符串。
start? 方法返回給定組匹配項的開始索引,
end 方法返回給定組匹配項的結束索引加 1 ;
span 以元組( start , end )的形式返回給組的開始和結束位置的索引。
?
----------------------------
正則表達式應該是不容易理解的一個知識點;python沒意思的基礎終于學完了。雖然學的不扎實,但大體有了個印象;后面的將會非常有意思,讀取文件,編寫圖形窗口,連接數據庫,web編程....
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
