Python正規表示式


正規表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式相符。

Python 自1.5版本起增加了re 模組,它提供 Perl 風格的正規表示式模式。

re 模組讓 Python 語言擁有全部的正規表示式功能。

compile 函數根據一個模式字串和可選的標誌參數產生一個正規表示式物件。該物件擁有一系列方法用於正規表示式匹配和替換。

re 模組也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字串做為它們的第一個參數。

本章節主要介紹Python中常用的正規表示式處理函數。


re.match函數

re.match 嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就回傳none。

函數語法

re.match(pattern, string, flags=0)

函數參數說明:

參數描述
pattern符合的正規表示式
#string要符合的字串。
flags標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。

匹配成功re.match方法傳回一個匹配的對象,否則返回None。

我們可以使用group(num) 或  groups() 符合物件函數來取得符合運算式。

匹配物件方法描述
#group(num=0)#匹配的整個表達式的字串,group() 可以一次輸入多個組號,在這種情況下它將傳回一個包含那些組所對應值的元組。
groups()傳回一個包含所有群組字串的元組,從 1 到 所含的小組號碼。

實例1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.match('com', 'www.php.cn'))         # 不在起始位置匹配

以上實例執行輸出結果為:

(0, 3)
None

實例2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

以上實例執行結果如下:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search方法

re.search 掃描整個字串並傳回第一個成功的匹配。

函數語法:

re.search(pattern, string, flags=0)

函數參數說明:

符合的正規表示式要符合的字串。 標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
#描述
##pattern
#string
flags
######

符合成功re.search方法傳回一個符合的對象,否則回傳None。

我們可以使用group(num) 或  groups() 符合物件函數來取得符合運算式。

匹配物件方法描述
#group(num=0)#匹配的整個表達式的字串,group() 可以一次輸入多個組號,在這種情況下它將傳回一個包含那些組所對應值的元組。
groups()傳回一個包含所有群組字串的元組,從 1 到 所含的小組號碼。

實例1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.search('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.search('com', 'www.php.cn').span())         # 不在起始位置匹配

以上實例運行輸出結果為:

(0, 3)
(11, 14)

實例2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
以上實例執行結果如下:
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match與re.search的區別

re.match只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函數傳回None;而re.search匹配整個字串,直到找到一個匹配。

實例:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"

matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
以上實例運行結果如下:
No match!!
search --> matchObj.group() :  dogs

檢索和替換

Python 的re模組提供了re.sub用於替換字串中的匹配項。

語法:

re.sub(pattern, repl, string, max=0)

傳回的字串是在字串中用 RE 最左邊不重複的匹配來替換。如果模式沒有發現,字元將被沒有改變地回傳。

可選參數 count 是模式匹配後替換的最大次數;count 必須是非負整數。預設值是 0 表示替換所有的匹配。

實例:

#!/usr/bin/python
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num
以上實例執行結果如下:
Phone Num :  2004-959-559
Phone Num :  2004959559

正規表示式修飾符- 可選標誌

正規表示式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。多個標誌可以透過位元 OR(|) 它們來指定。如re.I | re.M 被設定成I 和M 標誌:

#修飾符描述
re.I使匹配對大小寫不敏感
re.L做本地化識別(locale-aware)匹配
re.M多行匹配,影響^ 和$
re.S#使. 匹配包括換行在內的所有字元
re.U#根據Unicode字元集解析字元。這個標誌影響\w, \W, \b, \B.
re.X該標誌透過給予你更靈活的格式以便你將正規表示式寫得更容易理解。

正規表示式模式

模式字串使用特殊的語法來表示一個正規表示式:

字母和數字表示他們自己。一個正規表示式模式中的字母和數字匹配相同的字串。

多數字母和數字前加一個反斜線時會擁有不同的意義。

標點符號只有被轉義時才匹配自身,否則它們表示特殊的意義。

反斜線本身需要使用反斜線轉義。

由於正規表示式通常都包含反斜線,所以你最好使用原始字串來表示它們。模式元素(如 r'/t',等價於'//t')匹配對應的特殊字元。

下表列出了正規表示式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標誌參數,某些模式元素的意義會改變。

模式描述
#^符合字串的開頭
#$符合字串的結尾。
.符合任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
[...]用來表示一組字元,單獨列出:[amk] 匹配'a','m'或'k'
[^...]不在[]中的字元:[^abc] 符合除了a,b,c之外的字元。
re*符合0個或多個的表達式。
re+符合1個或多個的表達式。
re?符合0個或1個由前面的正規表示式定義的片段,非貪婪方式
re{ n}
re{ n,}精確地符合n個前面表達式。
re{ n, m}符合n 到m 次由前面的正規表示式定義的片段,貪婪方式
a| b符合a或b
(re)G符合括號內的表達式,也表示一個群組
(?imx)正規表示式包含三種可選標誌:i, m, 或x 。只影響括號中的區域。
(?-imx)正規表示式關閉 i, m, 或 x 可選標誌。只影響括號中的區域。
(?: re)類似(...), 但不表示一個群組
(?imx : re)在括號中使用i, m, 或x 可選標誌
#(?-imx: re)在括號中不使用i, m, 或x 可選標誌
(?#...)#註解.
(?= re)前向肯定界定符。如果所含正規表示式,以 ... 表示,在目前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。
(?! re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字串當前位置匹配時成功
#(?> re)匹配的獨立模式,省去回溯。
\w符合字母數字及底線
\W符合非字母數字及底線
\s匹配任意空白字符,等價於[\t\n\r\f].
\S符合任意非空白字元
\d符合任意數字,等價於[0-9].
\D符合任意非數字
#\A符合字串開始
\Z符合字串結束,如果是存在換行,只符合到換行前的結束字串。 c
\z符合字串結束
#\G符合最後符合完成的位置。
\b符合一個單字邊界,也就是指單字和空格間的位置。例如, 'er\b' 可以符合"never" 中的 'er',但不能符合 "verb" 中的 'er'。
\B符合非單字邊界。 'er\B' 能符合 "verb" 中的 'er',但不能符合 "never" 中的 'er'。
\n, \t, etc..符合一個換行符號。匹配一個製表符。等等
\1...\9匹配第n個分組的子表達式。
\10符合第n個分組的子表達式,如果它經過符合。否則指的是八進位碼的表達式。

正規表示式實例

字元符合

##實例描述python#匹配"python".

字元類別

##[ ^aeiou]除了aeiou字母以外的所有字元#[^0-9]符合除了數字外的字元
實例描述
#[Pp]ython匹配"Python" 或"python"
rub[ye]匹配"ruby" 或"rube"
[aeiou]符合中括號內的任一字母
#[0-9]符合任何數字。類似於[0123456789]
[a-z]符合任何小寫字母
[A-Z]符合任何大寫字母
[a-zA-Z0-9]符合任何字母及數字
特殊字元類別

實例描述. 符合"\n" 以外的任何單一字元。若要符合包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。 \d符合一個數字字元。等價於 [0-9]。 \D符合一個非數字字元。等價於 [^0-9]。 \s符合任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。 \S符合任何非空白字元。等價於 [^ \f\n\r\t\v]。 \w符合包括下劃線的任何單字字元。等價於'[A-Za-z0-9_]'。 \W符合任何非單字字元。等價於 '[^A-Za-z0-9_]'。
#