Latest web development tutorials

Python3 正則表達式

正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。

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.w3big.com').span())  # 在起始位置匹配
print(re.match('com', 'www.w3big.com'))         # 不在起始位置匹配

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

(0, 3)
None

實例2:

#!/usr/bin/python3
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/python3

import re

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

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

(0, 3)
(11, 14)

實例2:

#!/usr/bin/python3

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/python3

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, count=0)

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

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

實例:

#!/usr/bin/python3
import re

phone = "2004-959-559 # 这是一个电话号码"

# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)

# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)
以上實例執行結果如下:
电话号码 :  2004-959-559 
电话号码 :  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, 等. 匹配一個換行符。 匹配一個製表符。 等
\1...\9 匹配第n個分組的子表達式。
\10 匹配第n個分組的子表達式,如果它經匹配。 否則指的是八進製字符碼的表達式。

正則表達式實例

字符匹配

實例 描述
python 匹配"python".

字符類

實例 描述
[Pp]ython 匹配"Python" 或"python"
rub[ye] 匹配"ruby" 或"rube"
[aeiou] 匹配中括號內的任意一個字母
[0-9] 匹配任何數字。 類似於[0123456789]
[az] 匹配任何小寫字母
[AZ] 匹配任何大寫字母
[a-zA-Z0-9] 匹配任何字母及數字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-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_]'。