Python中的正規表示式(2)

2021-06-09 05:20:08 字數 3715 閱讀 1699

學習過最簡單的正規表示式的規則後,如何在實際中運用呢?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...