Professional Documents
Culture Documents
• 若要從一段字串中找出手機號碼:
1. 每 12 個字元進行一次搜尋是否滿足手機格
式?
2. 檢查第 5 與 9 字元是否為 “ -” ,其他字
元是否為 0~9 的數字?
• 需重複比對!
16-2 :正則表達式的基礎
• 正則表達式 (Regular Expression)
執行模式比對與搜尋
import re # 導入 re 模組
• 正則表達式是文字模式的表達方法
使用 \d 表示 0-9 的數字字元,手機號碼:
‘\d\d\d\d-\d\d\d-\d\d\d’
因為逸出字元:
‘\\d\\d\\d\\d-\\d\\d\\d-\\d\\d\\d’
(3-4-9 節 ) 字串加 r 防止逸出字元被轉譯:
r‘\d\d\d\d-\d\d\d-\d\d\d’
16-2-2 :使用 re.compile() 建立 Regex
物件
16-2-3 :搜尋物件
• Regex 物件
Re 模組內有 compile() 方法回傳 Regex 物件,參數為欲搜尋字串的正則表
達式,例如:
phoneRule = re.compile(r’\d\d\d\d-\d\d\d-\d\d\d’)
# 建立 phoneRule 物件
Regex 物件有 search() 方法可以搜尋是否有符合設定的正則表達式,例如:
phoneNum = phoneRule.search(msg)
# msg 是欲搜尋的字串
若無符合字串回傳 None
MatchObject 物件
只回傳第一個比對符合的字串
用 group() 方法回傳 MatchObject 物件的內容
16-2-3 :搜尋物件
• 重複出現可以用大括號加上次數表達,所以手機號碼的正則表達式可以簡化為:
r‘\d{4}-\d{3}-\d{3}’
16-2-5 :再看 re 模組
16-2-6 :再看正則表達式
• 程 式 實 例 ch16_6.py : 省 略
re.compile() 並使用 re.findall() 重新設
計 ch16_4.py
16-3 :更多搜尋比對模式
• 台北市電話號碼: 02-28350000
台北市電話號碼的正則表達式: r‘\d\d-\d\d\d\d\d\d\d\d’
• 使用小括號分組
以 ” -” 區別,用小括號隔開群組,台北市電話號碼的正則表達式:
r‘(\d{2})-(\d{8})’
• 使用 re.search() 比對
未來可以使用 group() 傳回比對符合的不同分組,
例如: group() 或 group(0) 傳回第一個符合的文字與 ch16_3.py 觀念相同。
如果 group(1) 則傳回括號的第一組文字, group(2) 則傳回括號的第二組文字
• 程 式 實 例 ch16_8.py : 使 用 小 括 號 分 組 的 觀 念 , 分 別 使 用
search() 與 findall() 搜尋並將內容輸出
16-3-2 : groups( )
• 以 re.search() 搜尋字串,可使用
groups() 取得分組的內容
注意: groups()
使用多重指定:
areaNum, localNum = phoneNum.groups( )
• 程 式 實 例 ch16_10.py : 針 對 re.search()
的部分重新設計 ch16_8.py ,分別列出區
域號碼與電話號碼
16-3-3 :區域號碼在小括號內
• 區域號碼用小括號: (02)-26669999
處理方式: \( 和 \)
例如: pattern = r”(\(\d{2}\))-(\d{8})”
16-3-4 :使用管道 (pipe) |
• 使用管道可同時搜尋比對多個字串
想同時搜尋 Mary 和 Tom:
pattern = ‘Mary|Tom’
# ’ 或 | 旁不可留空白
• 假設字串如下:
“Johnson, Johnnason and Johnnathan will
attend my party tonight.”
若 搜 尋 John 後 面 允 許
son 、 nason 、 nathan ,可以使用
下列正則表達式:
pattern = ‘John(son|nason|nathan)’
• 若允許某些括號內字串或正則表達式是
可有可無 ,例如: na 字串可有可無,
表達方式為 (na)?
• 若允許某些字串或正則表達式出現 0
到多次,例如: na 字串可出現 0 到
多次,表達方式為 (na)*
• 若允許某些字串或正則表達式出現 1
到多次,例如: na 字串可出現 1 到
多次,表達方式為 (na)+
• 例如:
1. \d+: 不限長度的數字
2. \w+: 表示不限長度的數字、字母和底線字元連續字元
• 程式實例 ch16_23.py :將一段英文句子的單字分離,同時將英文
單字前 4 個字母是 John 的單字分離。設定如下:
16-5-2 :字元分類
• Python 可以使用中括號來設定字元,範例:
[a-z]: a-z 小寫字元
[A-Z]: A-Z 大寫字元
[aeiouAEIOU]: 英文母音字元
[2-5]: 2-5 數字
• 程 式 實 例 ch16_33.py : re.match()
的應用。測試 1 將 John 放在被搜
尋字串的最前面,測試 2 沒有將
John 放在被搜尋字串的最前面
re.search() 或 re.match() 搜尋成
功會產生 MatchOjbect 物件
16-6-2 : MatchObject 幾個重要的方法
16-7 :搶救 CIA 情報員 -sub() 方法
• re 模組的 sub() 方法:用新的字串
取代原本字串
result = re.sub(pattern, newstr, msg)
# msg 欲處理的字串
pattern: 欲搜尋的字串
newstr: 搜尋成功則用 newstr
取代並回傳給 result (msg 不會
被更改! )
msg: 被搜尋的字串
• 在正則表達式中加入註解:
pattern 中加註解沒有問題
search(), findall(), compile() 執行時註解會有影響
需加入參數 re.VERBOSE
16-8-2 : re.VERBOSE
• 程式實例 ch16_38.py :搜尋市區
電話號碼的應用,這個程式可以
搜尋下列格式:
12345678 # 沒有區域碼
02 12345678 # 區域碼與電
話使用空格分隔
02-12345678 # 區域號碼與
電話使用 - 分隔
(02)-12345678# 區域碼有小
括號
02-12345678 ext 123 # 分機
02-12345678 ext. 123 # 分機
ext 右邊有 .
16-8-3 :電子郵件地址的搜尋
• 程式實例 ch16_39.py :電子郵件地址
搜尋
[a-zA-Z0-9_.] # 使用者
帳號常用的字元
@ # @ 符號
[a-zA-Z0-9_.] # 主機域
名
[\.] # . 符號
[a-zA-Z0-9_.]{2,4} # com,
edu 或其他
[\.] ? # . 符號,也
可能無 ( 特別是美國 )
[a-zA-Z0-9_.]? # 國別
16-8-4 : re.IGNORECASE/re.DOTALL/re.VERBOSE