目錄
你一定熟悉文本查找、文本輸入。比如我們谷歌一個問題來尋找答案,或則在我們的計算機裏搜索文件。我們也會填寫各種在線表格以及輸入一些文字。這裏就有一個問題,就是機器需要你提供個給它手機號碼,或者是學校的服務器要你的學號,諸如手機號和學號這樣的數字都是有自己固定的編寫格式,所以我們需要在用戶輸入之後檢查是否符合規定的格式。
對於後續的學習,你一定不會否定操作文本或者是數據的重要性。現在包括公安網公民信息、銀行賬戶信息、股票報價信息、新聞等等,都是一種數據,毫無疑問,這些數據是存儲在文本文件中的。所以能將這些文本或者數據以某種可被計算機識別和處理的模式表達出來是非常有用的。
先不談大海,且看看小溪。
這裏我們假設要統計一個羣體的手機號碼,那麼我們要保證用戶輸入的手機號碼符合手機號碼的命名規則。
(一)判斷號碼是否符合規則
這裏我們編寫了一個檢查手機號碼格式的代碼:
def isPhoneNumber(text):
if len(text) != 13:
return False
if text[3] != text[8] != '-':
return False
else:
return text
text = input("請按照123-4567-7890格式輸入手機號碼:")
if isPhoneNumber(text):
print("用戶手機號:",text)
else:
print("手機號輸入錯誤")
運行以上程序:
請按照123-4567-7890格式輸入手機號碼:123-4568-7895
用戶手機號: 123-4568-7895
上面這個程序實現了判斷用戶的手機號是否符合我們規定的格式。當然這裏手機號碼的格式也是假設的。
一個手機號碼很短,但是我們需要判斷的可能是上百萬個字符,這樣我們判斷的函數會十分的複雜,這種情況下,Python給我們提供了正則表達式的方案。
讓我們用正則表達式來實現以上功能。
(二)使用re進行判斷
1)什麼是正則表達式?
正則表達式(regex)是一種從某種模式的文本文件中識別並且提取數據的方法。
正則表達式(regex)爲高級的文本模式匹配、抽取、與/或文本形式的搜索和替換功能提供了基礎。 簡單地說,正則表達式(簡稱爲 regex)是一些由字符和特殊符號組成的字符串,它們描述了模式的重複或者表述多個字符,於是正則表達式能按照某種模式匹配一系列有相似特徵的字符串。
匹配(matching),指的是術語“模式匹配”(pattern-matching)。在 Python 術語中,主要有兩種方法完成模式匹配:“搜索”(searching),即在字符串任意部分中搜索匹配的模式;而“匹配”(matching)是指判斷一個字符串能否從起始處全部或者 部分地匹配某個模式。搜索通過 search()函數或方法來實現,而匹配通過調用 match()函數或方法實現。總之,當涉及模式時,全部使用術語“匹配”;我們按照 Python 如何完成模式匹配的方式來區分“搜索”和“匹配”。
2)用regex實現以上代碼
Python提供了正則表達式的模塊,在使用正則表達式之前,我們需要導入re模塊。
import re
text = input("請按照123-4567-7890格式輸入手機號碼:")
phoneNumber = re.compile('\d\d\d-\d\d\d\d-\d\d\d\d')
mo = phoneNumber.search(text)
if mo != None:
rsult = mo.group()
else:
rsult = "不符合設置的匹配模式"
print("該用戶電話號碼爲:", rsult)
運行以上代碼:
請按照123-4567-7890格式輸入手機號碼:123-4567-7895
該用戶電話號碼爲: 123-4567-7895
re中的數字字符
\d表示一個數字字符,即任何一位0到9的數字。Python使用正則表達式\d\d\d-\d\d\d\d-\d\d\d\d,裏匹配這裏的電話號碼。
但是正則表達式可以複雜得多。例如,在一個模式後加上花括號包圍的 3({3}),就是說,“ 匹配這個模式 3 次”。所以較短的正則表達式\d{3}-\d{4}-\d{4},也匹配正確的電話號碼格式。
創建正則表達式對象
這行代碼phoneNumber = re.compile('\d\d\d-\d\d\d\d-\d\d\d\d')實現了用compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象(簡稱爲Regex對象)。
將Regex對象保存在phoneNumber變量中。
匹配 Regex對象
Regex 對象的 search()方法查找傳入的字符串,尋找該正則表達式的所有匹配。如果在字符串中沒有找到該正則表達式模式,search()方法將返回None。如果找到了該模式, search()方法將返回一個Match 對象。Match 對象有一個group()方法,它返回被查找字符串中實際匹配的文本。
mo = phoneNumber.search(text)
回憶一下,Python 中轉義字符使用倒斜槓(\)。字符串'\n'表示一個換行字符, 而不是倒斜槓加上一個小寫的 n。你需要輸入轉義字符\\,才能打印出一個倒斜槓。 所以'\\n'表示一個倒斜槓加上一個小寫的 n。但是,通過在字符串的第一個引號之前加上 r,可以將該字符串標記爲原始字符串,它不包括轉義字符。 因爲正則表達式常常使用倒斜槓,向 re.compile()函數傳入原始字符串就很方 便 , 而不是輸入額外得到斜槓 。 輸 入 r'\d\d\d-\d\d\d-\d\d\d\d' , 比 輸 入 '\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d'要容易得多。
當然正則表達式還有很多得匹配模式,這裏只是簡單介紹,後續實際應用到得時候再來記錄。