學習過最簡單的正規表示式的規則後,如何在實際中運用呢?python中的re模組提供了正規表示式引擎的介面,允許使用者將表示式編譯成物件,然後再進行匹配。
將正規表示式編譯成格式物件,此物件含有不同的操作函式,如查詢或子串替換等。
>>> import re
>>> p = re.compile('ab*')
>>> print p
<_sre.sre_pattern object at 0x...>
re.compile()也可以接受乙個可選的引數flag,來選擇不同的特殊功能和語法變體。我們先執行乙個例子,再來講解flag的設定:
>>> p = re.compile('ab*', re.ignorecase)
將正規表示式樣式作為乙個字串傳遞給re.compile(),這是由於正規表示式不是python的核心功能,所以也沒有它的特殊語法(有些程式根本用不到正規表示式的功能,因而沒有必要將它放進核心語法中),但是re模組作為c語言的擴充套件被包含到python的模組中,類似的還有socket或zlib模組。
將正規表示式樣式設計為字串可以使python語言更加簡單,但是它有乙個缺點,將在下一節講解。
如前所述,正規表示式使用反斜槓來表明特殊形式或取消特殊意義,而python在字串中同樣使用反斜槓來實現相同意圖,從而帶來了衝突。
比如說你想寫出乙個正規表示式樣式來匹配latex中的\section,首先必須寫出相應的樣式,然後必須在每乙個反斜槓前再加乙個反斜槓來,如\\section,這個結果將傳遞給re.compile。然而,為了表示這是乙個python的字串,每乙個反斜槓必須再加乙個反斜槓!
字元狀態
\section
想要匹配的字元
\\section
為re.compile()去掉反斜槓
「\\\\section」
再加乙個反斜槓來表明它是乙個字串而非有特殊意義的單詞
簡而言之,對了匹配乙個無任何特殊意義的反斜槓,必須為正規表示式樣式寫上\\\\,因為正規表示式必須為\\,而python字串中的每乙個無特殊含義的反斜槓都必須以\\來代替。在正規表示式中,使用反斜槓的情況常常碰見,這將導致無數多數的反覆輸入反斜槓,從而造成最終的字串難於理解。
解決方法是使用python的未轉義的字串宣告:在以r為字首的字串中,反斜槓解除特殊含義,如r"\n"是乙個包含兩個字元的字串,而"\n"則是乙個字元表示換行。所以在python**中要使用這種表示方法來書寫正規表示式。
正規表示式的樣式
對應的未經轉義的字串
「ab*」
r」ab*」
「\\\\section」
r」\\section」
「\\w+\\s+\\s」
r」\w+\s+\1」
當你有乙個表示正規表示式的物件時,應當如何使用?樣式物件有不同的方法和屬性,這裡只列出了最為常用的幾個,包含全部方法和屬性的列表請參考re的幫助文件。
方法或屬性
用途match()
檢查是否在字串的開始處匹配
search()
在字串中掃瞄並尋找匹配的位置
findall()
尋找所有匹配的子串,並將結果返回到乙個列表中
finditer()
尋找所有匹配的子串,並將它們作為迭代器返回
如果沒有匹配成功,則match()和search()返回none;如果成功,將返回乙個matchobject物件,包含了匹配開始和結束的資訊、匹配的子串等等。
可以通過re模組來學習匹配的使用。如果你的系統安裝有tkinter,也可以檢視tools/scripts/redemo.py,它是python發行版中包含的乙個演示程式,允許你輸入正規表示式和字串並進行匹配。該演示程式在進行除錯複雜的正規表示式程式時非常有用。phil schwartz的kodos也是乙個用於正規表示式開發和測試的互動式工具。
python 2.2.2 (#1, feb 10 2003, 12:57:01)
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
<_sre.sre_pattern object at 0x...>
現在你可以針對正規表示式[a-z]+嘗試匹配不同的字串。乙個空串肯定不會匹配,因為+表示匹配乙個或多個,這種情況下呼叫match()應當返回none,這時python直譯器不會有任何輸出,你可以通過顯式的列印出匹配的結果來檢視。
>>> p.match("")
>>> print p.match("")
none
接著來嘗試乙個可以匹配的字串,這裡match()將返回乙個matchobject,你可以將這個物件儲存在變數中以便以後使用。
>>> m = p.match('tempo')
>>> print m
<_sre.sre_match object at 0x...>
可以請求matchobject來檢視匹配資訊,它也包含不同的方法和屬性,最重要的有:
方法或屬性
用途group()
返回匹配的字串
start()
返回匹配的開始位置(下標)
end()
返回匹配的結束位置
span()
返回乙個元組,它包含匹配的(開始,結束)的位置
嘗試以下方法將闡明上面這些方法的意思:
>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)
由於match()只檢查字串的起始位置,start()一定為0,但search()方法將遍歷整個字串,所以匹配可能不在起始位置。
>>> print p.match('::: message')
none
>>> m = p.search('::: message') ; print m
<_sre.sre_match object at 0x...>
>>> m.group()
'message'
>>> m.span()
(4, 11)
在實際的程式中,最常用的做法是將matchobject儲存在變數中,然後查檢是否為none,例如:
p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
print 'match found: ', m.group()
else:
print 'no match'
兩個成員函式將返回所有的匹配,其中乙個是findall(),它返回匹配字串的列表:
>>> p = re.compile('\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
['12', '11', '10']
findall()必須在返回結果前建立整個列表,finditer()函式返回matchobject物件序列的迭代器:
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
>>> for match in iterator:
... print match.span()
(0, 2)
(22, 24)
(29, 31)
Python 正規表示式 2
coding utf 8 匯入re模組 import re 原始字串 c c desktop print c 假設desktop的父路徑是c 我們如何匹配到呢 result re.match c c print result.group 但是這樣很複雜 容易讓人迷 所以在python 中提供乙個r表...
正規表示式 2
例 正規表示式物件 本物件包含正規表示式模式以及表明如何應用模式的標誌。語法 1 re pattern flags 語法 2 re new regexp pattern flags 引數 re 必選項。將要賦值為正規表示式模式的變數名。pattern 必選項。要使用的正規表示式模式。如果使用語法 1...
正規表示式2
本文參照python 核心程式設計第一章正規表示式 1 match函式的使用 import re m re.match foo foo if m is not none print m.group match 如果匹配成功,返回乙個匹配物件,不成功則返回none 如果我們不使用if判斷就使用m.gr...