前一天我們就如何讓程式可以認得不同的單字稍微討論了一下一些基本的處理,那今天我們就繼續文字的主題來介紹一個在處理文字資料的時候非常強大的工具——正規表示式(又稱作正則表示式)
其實和我們在第14天講的字串可以透過不同的格式化方式來傳入不同類型的變數,反過來我們同樣也能透過文字中不同樣子的字符來把它們抓出來,各語言的正規表示法可能有一點點不太一樣,這邊以python為例
\d
:一位數字\D
:任意一位不是數字的符號\s
:一個空格或換行符號\w
:英文字母\W
:任意一位不是英文字母的符號[\u4e00-\u9fa5]
:一個中文字.
:一位任意符號*
:(必須接在某個符號後面),0個或更多的該符號+
:(必須接在某個符號後面),1個或更多的該符號{3,4}
:(必須接在某個符號後面),3個~5個的該符號我們這邊以疾病管制署9/29的新聞稿為例
text = """
中央流行疫情指揮中心今(29)日公布國內新增11例COVID-19確定病例,分別為1例本土及10例境外移入;另確診個案中無新增死亡。
指揮中心表示,今日新增1例本土個案(案16326),為印尼籍30多歲女性,今(2021)年9月27日出現頭痛症狀,9月28日就醫採檢,於今日確診。衛生單位已匡列接觸者7人,均列居家隔離,其餘接觸者匡列中。
指揮中心指出,今日新增10例境外移入個案,為9例男性、1例女性,年齡介於20多歲至40多歲,入境日介於9月3日至9月28日,分別自美國(案16316)、哈薩克(2例,案16317、案16318)、巴基斯坦(案16319)、柬埔寨(16320)、俄羅斯(案16324)及菲律賓(案16325)入境,餘3例 (案16321、案16322、案16323)的旅遊國家調查中;詳如新聞稿附件。
指揮中心統計,截至目前國內累計3,358,228例新型冠狀病毒肺炎相關通報(含3,341,439例排除),其中16,216例確診,分別為1,581例境外移入,14,581例本土病例,36例敦睦艦隊、3例航空器感染、1例不明及14例調查中;另累計110例移除為空號。2020年起累計842例COVID-19死亡病例,其中830例本土,個案居住縣市分布為新北市412例、臺北市318例、基隆市28例、桃園市26例、彰化縣15例、新竹縣13例、臺中市5例、苗栗縣3例、宜蘭縣及花蓮縣各2例,臺東縣、雲林縣、臺南市、南投縣、高雄市及屏東縣各1例;另12例為境外移入。
指揮中心再次呼籲,民眾應落實手部衛生、咳嗽禮節及佩戴口罩等個人防護措施,減少不必要移動、活動或集會,避免出入人多擁擠的場所,或高感染傳播風險場域,並主動積極配合各項防疫措施,共同嚴守社區防線。
"""
import re
print(re.search("新增\d+例本土", text)) # re.search找到第一筆匹配的,回傳re.Match型態
print(re.findall("新增\d+例境外", text)) # re.findall找所有匹配的,回傳一個list
輸出:
<re.Match object; span=(78, 84), match='新增1例本土'>
['新增10例境外']
# %%
print(re.search("新增(\d+)例本土", text).group(1)) # group(n)表示取出這個表達式中第n個括號的內容
print(re.findall("新增(\d+)例境外", text)) # 有括號時findall會取出所有()內的結果
輸出:
1
['10']
print(re.findall("..[縣市]", text)) # []內表示都可以
輸出:
['居住縣', '新北市', '臺北市', '基隆市', '桃園市', '彰化縣', '新竹縣', '臺中市', '苗栗縣', '宜蘭縣', '花蓮縣', '臺東縣', '雲林縣', '臺南市', '南投縣', '高雄市', '屏東縣']
注意這邊因為居住縣市也符合了表達式的內容,因此被抓了出來
在使用re的過程中很常會需要注意和處理是否有包含到了不要的東西或是漏掉必要的東西以進行調整
網頁畫面
這邊可以在底下輸入要搜尋的範圍,上面輸入好你的正規表達式之後就可以即時的透過不同的顏色來快速檢查你的正規表達式是否符合需求啦~