扣丁學堂淺談Python基礎教程之正則表達式及實例代碼

今天扣丁學堂給大家介紹一下關於Python視頻教程之正則表達式的介紹,首先正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。Python自1.5版本起增加了re 模塊,它提供Perl 風格的正則表達式模式。

re模塊使Python 語言擁有全部的正則表達式功能,compile函數根據一個模式字元串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。

re模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字元串做為它們的第一個參數。下面主要介紹Python中常用的正則表達式處理函數。

re.match函數

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

Advertisements

函數語法:

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

函數參數說明:

參數描述

pattern匹配的正則表達式

string要匹配的字元串。

flags標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

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

我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

匹配對象方法描述

group(num=0)匹配的整個表達式的字元串,group()可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。

groups()返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。

Advertisements

實例 1

#!/usr/bin/python # -*- coding: UTF-8 -*- import reprint(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配

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

(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) ifmatchObj: 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 reprint(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配print(re.search('com', 'www.runoob.com').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) ifsearchObj: print "searchObj.group() : ", searchObj.group() print"searchObj.group(1) : ", searchObj.group(1) print"searchObj.group(2) : ", searchObj.group(2) else: print "Nothingfound!!"以上實例執行結果如下:

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) ifmatchObj: 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, flags=0)

參數:

pattern : 正則中的模式字元串。

repl : 替換的字元串,也可為一個函數。

string : 要被查找替換的原始字元串。

count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。

實例

#!/usr/bin/python # -*- coding: UTF-8 -*- import re phone ="2004-959-559 # 這是一個國外電話號碼" # 刪除字元串中的 Python註釋 num =re.sub(r'#.*$', "", phone) print "電話號碼是: ", num # 刪除非數字(-)的字元串 num= re.sub(r'\D', "", phone) print "電話號碼是 : ", num以上實例執行結果如下:

電話號碼是: 2004-959-559

電話號碼是 : 2004959559

repl 參數是一個函數

以下實例中將字元串中的匹配的數字乘於 2:

實例

#!/usr/bin/python # -*- coding: UTF-8 -*- import re # 將匹配的數字乘於 2def double(matched): value = int(matched.group('value')) returnstr(value * 2) s = 'A23G4HFD567' print(re.sub('(?P\d+)', double,s))

執行輸出結果為:

A46G8HFD1134

正則表達式修飾符 - 可選標誌

正則表達式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。多個標誌可以通過按位 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]

[a-z]匹配任何小寫字母

[A-Z]匹配任何大寫字母

[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_]'。

以上就是關於Python正則表達式的詳細介紹,最後想要學習Python開發的小夥伴一定要選擇專業的Python培訓機構。扣丁學堂作為知名的IT培訓機構,不僅有專業的老師和與時俱進的課程體系,還有大量的Python視頻教程供學員觀看學習,想要學好Python開發技術的小夥伴就抓緊時間行動吧。扣丁學堂Python技術交流群:279521237。

Advertisements

你可能會喜歡