我將從正規表示式開始講 Python 的標準庫。正規表示式是文書處理中常用的工具,而且不需要額外的系統知識或經驗。我們會把系統相關的包放在後面講解。
 
正規表示式 (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_(?Pd{4})”, “output_1986.txt”) #(?P…) 為 group 命名
print(m.group(“year”))

 
練習
有一個檔案,檔名為 output_1981.10.21.txt 。下面使用 Python: 讀取檔名中的日期時間資訊,並找出這一天是周幾。將檔案改名為 output_YYYY-MM-DD-W.txt (YYYY: 四位的年,MM:兩位的月份,DD:兩位的日,W:一位的周幾,並假設週一為一週第一天)
 
 
總結
re.search() re.match() re.sub() re.findall()
正規表示式構成方法
 
文章來自網際網路部落格網站,版權歸作者所有。作者:Vamei 出處:http://www.cnblogs.com/vamei