python標準庫:正則(re)

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

 

正則表達式(regular expression)主要功能是字符串(string)中通過特定的模式(pattern)搜索想要找到的內容。

語法

之前,我們簡介了字符串相關的處理函數。我們可以通過這些函數實現簡單的搜索功能,比如說從字符串“I love you”中搜索是否有“you”這一子字符串。但有些時候,我們只是模糊地知道我們想要找什麼,而不能具體說出我是在找“you”,比如說,我想找出字符串中包含的數字,這些數字可以是0到9中的任何一個。這些模糊的目標可以作爲信息寫入正則表達式,傳遞給Python,從而讓Python知道我們想要找的是什麼。

(官方documentation)

在Python中使用正則表達式需要標準庫中的一個包re

import re
m = re.search('[0-9]','abcd4ef')
print(m.group(0))

re.search()接收兩個參數,第一個'[0-9]'就是我們所說的正則表達式,它告訴Python的是,“聽着,我從字符串想要找的是從0到9一個數字字符”。

re.search()如果從第二個參數找到符合要求的子字符串,就返回一個對象m,你可以通過m.group()的方法查看搜索到的結果。如果沒有找到符合要求的字符,re.search()會返回None

 

如果你熟悉Linux或者Perl, 你應該已經熟悉正則表達式。當我們打開Linux shell的時候,可以用正則表達式去查找或着刪除我們想要的文件,比如說:

$rm book[0-9][0-9].txt

這就是要刪除類似於book02.txt的文件。book[0-9][0-9].txt所包含的信息是,以book開頭,後面跟兩個數字字符,之後跟有".txt"的文件名。如果不符合條件的文件名,比如說:

bo12.txt

book1.txt

book99.text

都不會被選中。

Perl中內建有正則表達式的功能,據說是所有正則表達式系統中最強的,這也是Perl成爲系統管理員利器的一個原因。

 

正則表達式的函數

m = re.search(pattern, string)  # 搜索整個字符串,直到發現符合的子字符串。
m = re.match(pattern, string)   # 從頭開始檢查字符串是否符合正則表達式。必須從字符串的第一個字符開始就相符。

可以從這兩個函數中選擇一個進行搜索。上面的例子中,我們如果使用re.match()的話,則會得到None,因爲字符串的起始爲‘a’, 不符合'[0-9]'的要求。

對於返回的m, 我們使用m.group()來調用結果。(我們會在後面更詳細解釋m.group())

 

我們還可以在搜索之後將搜索到的子字符串進行替換

str = re.sub(pattern, replacement, string) 
# 在string中利用正則變換pattern進行搜索,對於搜索到的字符串,用另一字符串replacement替換。返回替換後的字符串。

 

此外,常用的正則表達式函數還有

re.split()    # 根據正則表達式分割字符串, 將分割後的所有子字符串放在一個表(list)中返回

re.findall()  # 根據正則表達式搜索字符串,將所有符合的子字符串放在一給表(list)中返回

 

(在熟悉了上面的函數後,可以看一下re.compile(),以便於提高搜索效率。)

 

寫一個正則表達式

關鍵在於將信息寫成一個正則表達式。我們先看正則表達式的常用語法:

1)單個字符:

.          任意的一個字符

a|b        字符a字符b

[afg]      a或者f或者g的一個字符        

[0-4]      0-4範圍內的一個字符

[a-f]      a-f範圍內的一個字符

[^m]       不是m的一個字符

\s         一個空格

\S         一個非空格

\d         [0-9]

\D         [^0-9]

\w         [0-9a-zA-Z]

\W         [^0-9a-zA-Z]

 

2)重複

緊跟在單個字符之後,表示多個這樣類似的字符

*         重複 >=0 次

+         重複 >=1 次

?         重複 0或者1 次

{m}       重複m次。比如說 a{4}相當於aaaa,再比如說[1-3]{2}相當於[1-3][1-3]

{m, n}    重複m到n次。比如說a{2, 5}表示a重複2到5次。小於m次的重複,或者大於n次的重複都不符合條件。

 

正則表達          相符的字符串舉例

[0-9]{3,5}       9678

a?b              b

a+b              aaaaab

 

3) 位置

^         字符串的起始位置

$         字符串的結尾位置

 

正則表達          相符的字符串舉例        不相符字符串

^ab.*c$          abeec               cabeec (如果用re.search(), 將無法找到。)


4)返回控制

我們有可能對搜索的結果進行進一步精簡信息。比如下面一個正則表達式:

output_(\d{4})

該正則表達式用括號()包圍了一個小的正則表達式,\d{4}。 這個小的正則表達式被用於從結果中篩選想要的信息(在這裏是四位數字)。這樣被括號圈起來的正則表達式的一部分,稱爲羣(group)。
我們可以m.group(number)的方法來查詢羣。group(0)是整個正則表達的搜索結果,group(1)是第一個羣……

import re
m = re.search("output_(\d{4})", "output_1986.txt")
print(m.group(1))

 

我們還可以將羣命名,以便更好地使用m.group查詢:

import re
m = re.search("output_(?P<year>\d{4})", "output_1986.txt")   #(?P<name>...) 爲group命名
print(m.group("year"))
發佈了54 篇原創文章 · 獲贊 8 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章