1. 程式人生 > >正則介紹,創建、匹配Regex對象

正則介紹,創建、匹配Regex對象

查找字符串 環境 文本 hone 橫線 defined 例如 交互 python使用

1 前面的電話號碼查找程序能工作,但是 使用了很多代碼,做的事情卻有限;
isPhoneNumber()函數有17行,但只能查找一種電話號碼模式。像415.555.4242或者(415)555-4242這樣的電話號碼格式,該怎麽查?
如果電話號碼有分機,例如415-555-4242 x99,該怎麽查?
所以isPhoneNumber()函數在驗證的時候會失敗。

2 正則表達式,簡稱為regex,是文本模式的描述方法。
例如,\d 是一個正則表達式,表示一位數字字符,即任何一位0到9的數字。
python使用正則表達式 \d\d\d-\d\d\d-\d\d\d,來匹配前面isPhoneNumber()函數匹配的同樣文本:3個數字、一個短橫線、3個數字、一個短橫線、4個數字
所有其他字符串都不能匹配 \d\d\d-\d\d\d-\d\d\d 正則表達式

但是 正則表達式可以復雜得多。
例如:在一個模式後加上花括號包圍的3({3}),就是說,"匹配這個模式3次"。所以較短的正則表達式 \d{3}-\d{3}-\d{4},也可以匹配正確的電話號碼格式。


python中所有正則表達式的函數都在re模塊中。在交互式環境中輸入一下代碼,導入該模塊
import re
註意:在實際的開發例子中,都需要用到re模塊,所以要記得在每個腳本開始處導入它,或者重新啟動IDLE時。
否則會報錯,錯誤消息 NameError:name‘re‘is not defined

向re.compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象(或者就簡稱為Regex對象)

要創建一個regex對象來匹配電話號碼模式,就在交互式環境下輸入以下代碼:
回憶以下,\d 表示"一個數字字符",\d\d\d-\d\d\d-\d\d\d\d是正確電話號碼模式的正則表達式。

phoneNumRegex = re.compile(r‘\d\d\d-\d\d\d-\d\d\d\d‘)

現在 phoneNumRegex 變量包含了一個 Regex對象


Regex 對象的search()方法查找傳入的字符串,尋找該正則表達式的所有匹配。
如果字符串中沒有找到該正則表達式模式,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使用正則表達式的步驟:
1 用 import re 導入正則表達式
2 用 re.compile()函數創建一個Regex對象(記得使用原始字符串)
3 向Regex對象的search()方法傳入想查找的字符串。它將返回一個Match對象
4 調用Match對象的group()方法,返回實際匹配文本的字符串

可利用網頁的正則表達式測試程序,可以清楚的表示,一個正則表達式如何匹配輸入的一段文本
推薦的測試程序位於 http://regexpal.com/

正則介紹,創建、匹配Regex對象