Python自學筆記 | 讓re來整理資料吧
Hey guys~ 我是阿本
在阿本還是大學生的時候,曾傻傻地以為只要把資料一股腦往電腦裡面丟,程式就會幫我完成我的工作。這聽起來很美好對吧!
然而當我踏進資料科學後,才發現其實資料科學最重要、也最麻煩的工作不是分析和視覺化,而是資料處理。常常就是這些沒有標準化處理或疏漏的文字問題沒有處理而造成資料分析的錯誤。
這時,這次的主角re出現了~
什麼是re?
re的全名是Regular Expression,中文通常稱它為「正則表達式」或「正規表達式」。是python中的字串處理模組,能夠用在字串中搜尋「符合特定規則」的字串。
雖然不使用re也依然能夠完成任務,只是比較麻煩XD
正規表示式由常數和算子組成,它們分別表示字串的集合和在這些集合上的運算。當然如果把所有規則全部列出來大概所有人都離開了(至少我覺得要記住所有字媛分類那些蠻沒意義的),所以就先看看他能做些什麼吧!!
re實用操作1:搜尋與替換
re可以幫助我們搜尋特定文字或替換文字
說到底其實就是Ctrl+F跟Ctrl+H一樣的功能
像是如果今天想從一段文字中挑出電子郵件,我們可以這樣做:
import re text = "Contact us at info@domain.com or support@domain.com." pattern = r'\b[\w\.-]+@[\w\.-]+\.\w+\b' # 搜尋 emails = re.findall(pattern, text) print(emails) #Output:['info@domain.com', 'support@domain.com']
re.findall可以幫助我們尋找符合條件的所有值,其中我們的條件:
pattern = r'\b[\w\.-]+@[\w\.-]+\.\w+\b'
即是用來挑選電子郵件的正則表達式,其中
- \b是代表單詞的邊界(word boundary)。單詞的邊界指的是單詞的開始或結束位置,或者單詞和非單詞字符之間的位置。順告一提,也可用^(開頭)和$(結尾)來標記位置。
- [ ]是一個集合,表示可以匹配其中任意一個字符。例如,[abc]表示可以匹配字符a、b或c。
- \w表示匹配任意字母、數字或下劃線。相當於[a-zA-Z0-9_]。
- +表示匹配前面的字符集一次或多次。因此\w+代表可以匹配多個任意字母、數字或下劃線的字符。
- \.是用來匹配句點的,因為句點在正則表達式中有特殊的含義,需要使用反斜杠進行轉義處理。
但這電子郵件後面的地址似乎寫錯了,我們來把domain.com修正成gmail.com吧!
import re text = "Contact us at info@domain.com or support@domain.com." # 使用 re.sub 函數替換 new_text = re.sub(r'\b@[\w.-]+\.\w+\b', '@gmail.com', text) # 輸出結果 print(new_text) #Output:'Contact us at info@gmail.com or support@gmail.com.'
看吧!感覺很容易吧!
re實用操作2:驗證
除了基本的搜尋替換外,re還能當作驗證資料格式的工具。
例如下面這個電話驗證工具:
import re verify=0 while verify==0: phone_number = input("請輸入電話號碼: ") pattern = r'^\d{4}-\d{3}-\d{3}$' if re.match(pattern, phone_number): print("正確電話格式") verify=1 else: print("電話號碼格式錯誤,請重新輸入")
從這個程式碼,當輸入錯誤的格式,如0123456789時,他會回傳「電話號碼格式錯誤,請重新輸入」並請你重新輸入。直到輸入正確格式才會結束。
阿對了!{ }是一個量詞符號,\d{4}代表匹配4個數字,若是寫\d{4,}則代表匹配4個以上數字。
re實用操作3:分割
當碰到一組沒有分割過的文字資料該怎麼把牠們分開來呢?那就用re的split功能吧~
import re text = "apple, banana; pear orange" pattern = r'[ ,;]+' words = re.split(pattern, text) print(words)
透過這個方式,可以根據空格、逗號、分號將所有水果單詞切割開來。
re實用操作4:分組
re同時也有一種功能叫做group(),當在正則表達式中使用括號()時,可以將匹配的子字符串分組。group()方法用於返回與每個分組對應的字符串。
import re pattern = r'\S+(\d{2,3})\S+(\d{2,3})\S+(\d{2,3})' text = '小明今年18歲,小吳36,小吳54歲,他們年齡正好都差同個倍數' match = re.search(pattern, text) # 返回比對成功的字串 print(match.group(0)) # Output: '小明今年18歲,小吳36,小吳54' # 返回第一個分組 print(match.group(1)) # Output: '18' # 返回第二個分組 print(match.group(2)) # Output: '36' # 返回第三個分組 print(match.group(3)) # Output: '54' # 返回所有分組 print(match.groups()) # Output: ('18', '36', '54')
re可以玩的功能還很多,同時也有很多坑可以踩,剛好網路上也有許多測試正則表達的網站,像是regex101,可以放肆的亂打做練習。
好啦今天的分享先到這樣~我是阿本~咱們下次見!