持更中!!!

簡介

正規表達式代表一種有規律、規則的表達方式。

「Python正規表示式」可以做什麼?
就本質上而言,編寫程式語言的目的,是要利用程式幫助我們處理事情,將繁瑣複雜的事簡單化,讓規律的事情自動化。

舉個例子來說,當我們要在一堆資料裡判斷某一串字符是否為電話號碼(0988-888-888)時我們可能首先會比對那一串字符是不是12個字符(10個數字加上兩個-),接者再判斷該字符串中的每一個字符(除了第五個和第九個是-)是不是數字,然而這樣就會大量的使用到for, if 等,若是我們使用正規表達式,我們可以這樣判斷:

1
2
import re
phoneNumRegex = re.compile(r'\d\d\d\d-\d\d\d-\d\d\d')

「正規表示式」有強大的比對功能,為多種字元條件設定了特定的符號,例如要找數字,以 \d 表示,就會讓 Python 去判別字元是不是數字。
這樣我們就可以快速在一堆字蝠中找出我們要的資料啦~

建立Regex物件

首先,最重要的第一個步驟,那當然就是import re啦!(re就是regular expression模組的名稱)

匯入 re 模組就像是找到一部車子,你還要學會怎麼發動引擎才能開始讓車子運轉,送你到達目的地。
要啟動引擎,要先找到鑰匙孔或者是啟動的按鍵。
建立 Regex 物件就是啟動的關鍵。

要建立Regex物件,要使用re模組中的compile()函式,以re.compile()來表示,在compile()函式的括號中填入你需要的規則,也就是編譯一個規則,放到括號中。

以找電話號碼為例,我們設定要找的號碼格式是:0988-888-888,四碼數字-三碼數字–三碼數字。
在正規表示式中,\d 代表一個只能是數字的字元,我們就用 \d 來建立電話號碼格式。

1
phoneNumRegex = re.compile(r'\d\d\d\d-\d\d\d-\d\d\d')

建立的好的Regex物件,我們把它指派給一個好懂得變數,方便之後使用,才不用一直打,只要打出 phoneNumRegex,就代表你所設定的規則。

眼尖的你可能會發現,compile() 括號內怎麼有個 r,要求原始字串。
這是因為正規表示式,會用到許多符號,可能會與 Python 內建的功能相衝突,所以會在你需要的格式前面加上 r ,代表原始字串 raw。

瞭解更多

比對Regex

接著就要來講一些入門用法啦!先學幾個基本的用法就好,等到對正規表示式的觀念建立了,再去拓展、延伸~

比對資料可以使用 search() 或 findall() 方法,search()只會找出符合規則的一筆資料,findall()則是會把所有符合的資料都找出來給你,所以才叫 find all。

search()方法可以幫助我們找對比對成功的第一筆電話
如果有找到符合規則的,便會得到一個 Match 物件;如果沒有找到,則會得到 None。

1
2
3
phoneNumRegex = re.compile(r'\d\d-\d\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('Call me at 0988-888-888 by today.')
print(mo.group())

而呼叫 Match 物件需要使用 group()方法,才可以把找到的東西呈現出來,也就是程式才會顯示出比對正確的字串。

執行過就會得到這樣的輸出啦!

0988-888-888

findall()

findall()方法一看就是會幫你把所有符合規則的資料找齊

1
2
3
phoneNumRegex = re.compile(r'\d\d\d\d-\d\d\d-\d\d\d')
mo = phoneNumRegex.findall('Please call David at 0988-888-888 by today. 0988-888-888 is his office number.')
print(mo)

執行過就會得到這樣的輸出啦!

['0988-888-888', '0988-888-888']

想看更多findall()在爬蟲中實例可以前往這呦!👉瞭解更多

search() findall() 差異

  1. 你不需要使用 group() 就可以呈現出比對成功的結果。
  2. findall()方法返回串列(list),串列內的項目是字串(string);然而 search() 方法擇返回字串(string)。

更多用法

其實正規表達式還有很多很多用法,但因為實在太懶了哈哈所以就簡單介紹一下啦~
等到我真的運用自如的時候再來做詳細介紹嗚嗚嗚 希望有那一天的到來嘿嘿!

參考

  1. Python正規表示式:不一定要會,但會了超省力