標籤:完整 使用 import 顯示 mpi 怎麼 空值 one 沒有
1 前面的電話號碼尋找程式能工作,但是 使用了很多代碼,做的事情卻有限;
isPhoneNumber()函數有17行,但只能尋找一種電話號碼模式。像415.555.4242或者(415)555-4242這樣的電話號碼格式,該怎麼查?
如果電話號碼有分機,例如415-555-4242 x99,該怎麼查?
所以isPhoneNumber()函數在驗證的時候會失敗。
2 Regex,簡稱為regex,是文字模式的描述方法。
例如,\d 是一個Regex,表示一位元字字元,即任何一位0到9的數字。
python使用Regex \d\d\d-\d\d\d-\d\d\d,來匹配前面isPhoneNumber()函數匹配的同樣文本:3個數字、一個虛線、3個數字、一個虛線、4個數字
所有其他字串都不能匹配 \d\d\d-\d\d\d-\d\d\d Regex
但是 Regex可以複雜得多。
例如:在一個模式後加上花括弧包圍的3({3}),就是說,"匹配這個模式3次"。所以較短的Regex \d{3}-\d{3}-\d{4},也可以匹配正確的電話號碼格式。
python中所有Regex的函數都在re模組中。在互動式環境中輸入一下代碼,匯入該模組
import re
注意:在實際的開發例子中,都需要用到re模組,所以要記得在每個指令碼開始處匯入它,或者重新啟動IDLE時。
否則會報錯,錯誤訊息 NameError:name‘re‘is not defined
向re.compile()傳入一個字串值,表示Regex,它將返回一個Regex模式對象(或者就簡稱為Regex對象)
要建立一個regex對象來匹配電話號碼模式,就在互動式環境下輸入以下代碼:
回憶以下,\d 表示"一個數字字元",\d\d\d-\d\d\d-\d\d\d\d是正確電話號碼模式的Regex。
phoneNumRegex = re.compile(r‘\d\d\d-\d\d\d-\d\d\d\d‘)
現在 phoneNumRegex 變數包含了一個 Regex對象
Regex 對象的search()方法尋找傳入的字串,尋找該Regex的所有匹配。
如果字串中沒有找到該Regex模式,search()方法將返回None。如果找到了該模式,search()方法返回一個Match。
Match有一個group()方法,它返回被尋找字串中實際匹配的文本,
例如:
phoneNumRegex = re.compile(r‘\d\d\d-\d\d\d-\d\d\d\d‘)
mo = phoneNumRegex.search(‘My number is 415-555-4242.‘)
print(‘Phone number found:‘ + mo.group)
變數名 mo是一個通用的名稱,用於Match對象。這個例子可能看起來有點複雜,但它比前面的isPhoneNumber.py程式短很多,並且做的事情一樣。
以上代碼的步驟:
1 將期待的模式傳遞給re.compile(),並且將的得到的Regex對象儲存在phoneNumRegex中。
2 在phoneNumRegex上調用search(),向它傳入想尋找的字串
3 尋找的結果儲存在變數mo中
在這個例子中,
1 知道模式會在這個字串中找到,所以知道會返回一個Match對象。
2 知道mo包含一個Match對象,而不是空值,就可以在mo變數上調用group(),返回匹配的結果。
3 將mo.group()寫在列印語句中,顯示出完整的匹配,即 415-555-4242
python使用Regex的步驟:
1 用 import re 匯入Regex
2 用 re.compile()函數建立一個Regex對象(記得使用原始字串)
3 向Regex對象的search()方法傳入想尋找的字串。它將返回一個Match對象
4 調用Match對象的group()方法,返回實際匹配文本的字串
可利用網頁的Regex測試程式,可以清楚的表示,一個Regex如何匹配輸入的一段文本
推薦的測試程式位於 http://regexpal.com/
正則介紹,建立、匹配Regex對象