iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
AI & Data

邁向成為語言資料科學家的偉大航道系列 第 5

【NLP】Day 5: 大風吹,吹什麼,吹...正規表達式(3)萃取

  • 分享至 

  • xImage
  •  

我們確實曾經擁有一切,對吧?我是說,如果你仔細回想的話,就會發現確實是這麼一回事。
《華爾街之狼》

轉眼間,我們也來到了正規表達式的最終章,也就是萃取啦!有些反應比較快的朋友可能會想說,萃取不就跟第一週的re.search()一樣嗎?如果一樣要輸出匹配的字串的話,那就直接用re.search()不就好了?幹嘛還要再多學這個?

這是一個很好的問題,我們話不多說,就直接來看實例。這次我從維基百科的獵人 Hunter x Hunter條目中擷取了一小段文字,然後這次的任務是需要將這段文字中,每一篇獵人的篇章所在的漫畫話數全部都取出來,這樣才方便之後連載再開的時候直接找到需要複習的篇章。

"""
蟻王篇 No.186-318(單行本18卷 - 30卷)小傑與奇犽使用貪婪之島破關獎品打算去找金。但是在那裏等著的並不是金,而是凱特。凱特他們在未確認生物的探索和調查中,發現巨型嵌合蟻的殘骸,一行人前往NGL。小傑和奇犽瞭解嵌合蟻的強大,在凱特的犧牲下逃出NGL。在討伐隊還尚未準備完全之際,嵌合蟻王誕生了。王率領直屬護衛隊和一部份士兵,在背後統治東果陀共和國,打算進行『選別』(挑選)。為了防止更多的人死亡以及為凱特報仇,小傑一行人再次向嵌合蟻挑戰。十二支會長篇 No.319-339(單行本30卷 - 32卷)十二支登場,尼特羅會長於嵌合蟻之役死後,從獵人協會會長退位,開始選拔新的獵人協會會長。全世界的獵人為了新的獵人會長選舉一事紛紛開始活動;另一方面,奇犽為了拯救傷重的小傑而再度回到揍敵客家族。暗黑大陸篇 No.340- (單行本32卷 - )有天自稱尼特羅之子的比洋德·尼特羅在卡丁帝國支持下向全世界發表招募同伴前往暗黑大陸的影片,在十二支們接獲V5所發出的「追捕比洋德」命令的同一時間,比洋德主動前來被逮捕並要求交換條件──十二支需陪同他一起至暗黑大陸。同時雷歐力和酷拉皮卡加入十二支並接替十二支的子、亥之位置。金以No.2身分加入比洋德雇用前往暗黑大陸的專家團隊,後來當卡丁帝國的船發出後,和其他包括12支的獵人也登上船,酷拉皮卡成為第八王妃奧伊特和第十四王子的保鑣,其目的為第四王子手上收藏的族人眼睛。船的目的地為鄰近暗黑大陸邊界的假想「新大陸」,航行過程中,王位爭奪戰正式展開。
"""

先來看看符合字串的正規表達式怎麼寫,在本篇不會仔細說明正規表達式是如何運作的,但如果你需要詳細介紹的話,可以去看我第三天的文章

No\.\d{3}-\d{0,3}

稍微講解一下這段正規表達式:在No後面有一個小點點,要記得在前面加上逃脫字元\,不然.是正規表達式中的黑暗大法師,他會代表所有的字元,也會把所有的字元通通都吸進去,要小心使用。後面最後之所以是\d{0,3}是因為注意到暗黑大陸篇由於尚在連載中,所以還沒有結尾話數(我先哭)

先來看看,如果這時候用前天我們所學的re.search()會發生什麼事。

import re # 要記得引入函式庫
test_string = "蟻王篇 No.186-318(單行本18卷 - 30卷)小傑與奇犽使用貪婪之島破關獎品打算去找金。但是在那裏等著的並不是金,而是凱特。凱特他們在未確認生物的探索和調查中,發現巨型嵌合蟻的殘骸,一行人前往NGL。小傑和奇犽瞭解嵌合蟻的強大,在凱特的犧牲下逃出NGL。在討伐隊還尚未準備完全之際,嵌合蟻王誕生了。王率領直屬護衛隊和一部份士兵,在背後統治東果陀共和國,打算進行『選別』(挑選)。為了防止更多的人死亡以及為凱特報仇,小傑一行人再次向嵌合蟻挑戰。十二支會長篇 No.319-339(單行本30卷 - 32卷)十二支登場,尼特羅會長於嵌合蟻之役死後,從獵人協會會長退位,開始選拔新的獵人協會會長。全世界的獵人為了新的獵人會長選舉一事紛紛開始活動;另一方面,奇犽為了拯救傷重的小傑而再度回到揍敵客家族。暗黑大陸篇 No.340- (單行本32卷 - )有天自稱尼特羅之子的比洋德·尼特羅在卡丁帝國支持下向全世界發表招募同伴前往暗黑大陸的影片,在十二支們接獲V5所發出的「追捕比洋德」命令的同一時間,比洋德主動前來被逮捕並要求交換條件──十二支需陪同他一起至暗黑大陸。同時雷歐力和酷拉皮卡加入十二支並接替十二支的子、亥之位置。金以No.2身分加入比洋德雇用前往暗黑大陸的專家團隊,後來當卡丁帝國的船發出後,和其他包括12支的獵人也登上船,酷拉皮卡成為第八王妃奧伊特和第十四王子的保鑣,其目的為第四王子手上收藏的族人眼睛。船的目的地為鄰近暗黑大陸邊界的假想「新大陸」,航行過程中,王位爭奪戰正式展開。"
print(re.search("No\.\d{3}-\d{0,3}", test_string))
<re.Match object; span=(4, 14), match='No.186-318'>

我們會發現,如果只有使用re.search(),函式只會回傳符合的第一個字串,這時該怎麼辦?因為我們想要的是所有符合的字串,只回傳符合的第一個字串,就不符合我們的需求了。這時候就要好好地利用新的函式re.findall()了。re.findall()會找出所有符合的字串,並以串列的形式回傳。話不多說,就讓我們來試試看吧!

import re # 要記得引入函式庫
test_string = "蟻王篇 No.186-318(單行本18卷 - 30卷)小傑與奇犽使用貪婪之島破關獎品打算去找金。但是在那裏等著的並不是金,而是凱特。凱特他們在未確認生物的探索和調查中,發現巨型嵌合蟻的殘骸,一行人前往NGL。小傑和奇犽瞭解嵌合蟻的強大,在凱特的犧牲下逃出NGL。在討伐隊還尚未準備完全之際,嵌合蟻王誕生了。王率領直屬護衛隊和一部份士兵,在背後統治東果陀共和國,打算進行『選別』(挑選)。為了防止更多的人死亡以及為凱特報仇,小傑一行人再次向嵌合蟻挑戰。十二支會長篇 No.319-339(單行本30卷 - 32卷)十二支登場,尼特羅會長於嵌合蟻之役死後,從獵人協會會長退位,開始選拔新的獵人協會會長。全世界的獵人為了新的獵人會長選舉一事紛紛開始活動;另一方面,奇犽為了拯救傷重的小傑而再度回到揍敵客家族。暗黑大陸篇 No.340- (單行本32卷 - )有天自稱尼特羅之子的比洋德·尼特羅在卡丁帝國支持下向全世界發表招募同伴前往暗黑大陸的影片,在十二支們接獲V5所發出的「追捕比洋德」命令的同一時間,比洋德主動前來被逮捕並要求交換條件──十二支需陪同他一起至暗黑大陸。同時雷歐力和酷拉皮卡加入十二支並接替十二支的子、亥之位置。金以No.2身分加入比洋德雇用前往暗黑大陸的專家團隊,後來當卡丁帝國的船發出後,和其他包括12支的獵人也登上船,酷拉皮卡成為第八王妃奧伊特和第十四王子的保鑣,其目的為第四王子手上收藏的族人眼睛。船的目的地為鄰近暗黑大陸邊界的假想「新大陸」,航行過程中,王位爭奪戰正式展開。"
print(re.findall("No\.\d{3}-\d{0,3}", test_string))
['No.186-318', 'No.319-339', 'No.340-']

我們可以發現,如果使用re.findall()就能把所有的話數範圍找出來了!

好!那有關正規表達式的介紹就到這篇結束啦!明天開始就要進入斷詞方法了,大家抓緊好要出發了嗎?我們明天見囉!


上一篇
【NLP】Day 4: 什麼!文本也可以偷天換日?正規表達式 (2) 替換
下一篇
【NLP】Day 6: 斷開一切的牽連!一同探訪「斷詞」與他們的產地
系列文
邁向成為語言資料科學家的偉大航道30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言