iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Python

從0開始學習Python-為未來學習AI奠定基礎系列 第 20

從0開始學習Python---正則表達式、過濾留言中的不雅字詞

  • 分享至 

  • xImage
  •  

正則表達式

正則表達式(Regular Expressions, 簡稱 regex)是一種用來處理文字的強大工具。它可以幫我們輕鬆找出符合特定模式的字串,這在 AI 的資料處理、自然語言處理(NLP)等領域非常有用。

以日常生活中常見的應用來說,我們可以使用正則表達式來過濾或提取有用的資訊,比如電子郵件、電話號碼、日期格式等。


正則表達式的核心語法

  • . : 任意一個字元(除了換行符號)
  • \d : 任意一個數字(0-9)
  • \w : 任意一個字母、數字或底線
  • + : 重複出現 1 次以上
  • * : 重複出現 0 次以上
  • ? : 出現 0 次或 1 次
  • [] : 字元集合,匹配其中任意一個字元
  • ^ : 字串開頭
  • $ : 字串結尾
  • | : 「或」的意思,表示兩種選擇之一
  • () : 群組,通常用來標示我們想要擷取的部分

正則表達式如何運用在 AI

在 AI 領域中,常常需要處理大量的文本資料。透過正則表達式,我們可以更快速地整理、提取資訊。例如:

  • 資料清理:去除不必要的標點符號或雜訊
  • 文字分析:從大量的文章或文件中抽取出關鍵字、日期、或特定格式的資訊
  • 格式檢查:確保輸入的資料符合預期的格式(如電子郵件地址、電話號碼)

例題一:找出句子中的電子郵件

利用正則表達式來找出輸入中的電子郵件地址,這樣的寫法很適合用在分析社交媒體數據或自動分類郵件中。

https://ithelp.ithome.com.tw/upload/images/20240920/20168994SKsqt41lXi.png

  • find_email 是一個函數,用來從輸入的 text 字串中提取出所有符合條件的電子郵件地址。

  • r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' 是我們用來找電子郵件的正則表達式:

  1. \b 是單詞邊界,確保我們只匹配整個電子郵件,不是字串的一部分。
  2. [A-Za-z0-9._%+-]+ 匹配電子郵件的用戶名部分,允許字母、數字、點、底線等字符。
  3. @ 是電子郵件中的分隔符。
  4. [A-Za-z0-9.-]+ 匹配郵件的域名部分。
  5. \.[A-Z|a-z]{2,} 匹配結尾的「.com」、「.org」等後綴,後面至少有兩個字母。
  • re.findall():這個方法會返回所有符合條件的電子郵件地址。

  • 測試中輸入了一個包含兩個電子郵件地址的範例字串,並通過 find_email() 函數找出其中的電子郵件,最後將結果輸出。

https://ithelp.ithome.com.tw/upload/images/20240920/20168994baV4b0JTXv.png


例題二:從文字中提取日期

接著來試試看提取文本中的日期,這在日誌分析、文件處理等任務中很有用。

https://ithelp.ithome.com.tw/upload/images/20240920/20168994VV8FyEZwrF.png

  • find_dates 是一個函數,用來從輸入的 text 中提取所有符合日期格式的字串。
  • 我們用 \b\d{4}[-/]\d{2}[-/]\d{2}\b|\b\d{2}[-/]\d{2}[-/]\d{4}\b' 來匹配不同的日期格式:
  1. \d{4} :表示 4 位數字(年份)
  2. [-/] :表示日期中的分隔符,允許 -/
  3. \d{2} :表示月份和日期
  4. | :來處理兩種常見的日期格式(例如 YYYY-MM-DD 或 DD/MM/YYYY)
  • re.findall(): 在 text 中找到所有符合 date_pattern 的日期,並返回一個包含所有找到日期的列表。這裡 date_pattern 用來匹配兩種格式的日期。
  • 測試中,我們輸入了一個包含兩種日期格式的文字:
    2024-09-15 是 YYYY-MM-DD 格式。
    15/09/2024 是 DD/MM/YYYY 格式。

https://ithelp.ithome.com.tw/upload/images/20240920/20168994ojQr30fmtN.png

  • 最後的輸出可以看到函數成功提取了這兩個日期,並將它們放入一個列表中。

小專題:從留言中過濾不雅字眼

社交媒體的平台上,有時會出現不當的留言。這時可以透過 Python 的正則表達式,自動過濾掉這些不雅字眼,來維持乾淨的留言區。

建立一個簡單的留言過濾器,當用戶輸入留言時,若有不雅字眼,系統會自動將它們替換成「***」。以下是題目的要求:

  1. 使用正則表達式 來檢測不雅字眼。
  2. 替換不雅字 以保持留言區乾淨。
  3. 提示使用者 留言中含有被過濾的字詞。

程式碼總覽

https://ithelp.ithome.com.tw/upload/images/20240920/201689943PVVvHxywv.png


解題分析

  1. 定義不雅字清單:首先我們建立一個不雅字的清單 bad_words = ['stupid', 'idiot', 'dumb'],這些字詞會被過濾器偵測到並替換。

  2. 建立正則表達式
    使用 r'|'.join(bad_words) 將這些字詞轉換成一個正則表達式字串,| 是「或」的意思,可以同時檢測多個不雅字。

  3. 正則表達式替換
    re.sub() 函數用來匹配並替換不雅字,這裡使用了 flags=re.IGNORECASE 來忽略大小寫,確保同個詞(如「Stupid」和「stupid」)都能被偵測。

4.提醒留言已過濾
如果 filtered_message 和原始 message 不相同,代表系統已經過濾了不雅字眼,並給出提示。

  1. 檢查替換結果
  • 透過比對過濾前後的字串來檢查是否有字詞被替換,如果發現不雅字,系統會提示使用者「系統提示: 你的留言包含不雅字眼,已自動過濾。」。
  • 將使用者的輸入傳給 filter_message() 函數,過濾不雅字眼,然後顯示過濾後的留言。

測試輸入與輸出

https://ithelp.ithome.com.tw/upload/images/20240920/20168994Dm23sirJGV.png

  • 先測試使用不同的不雅字眼,系統是否會出現提示,而提示後是否會將不雅的詞改為 *** 。
  • 再來測試正常的留言,過濾後是否為原留言。
  • 最後測試輸入v是否能結束整個程式的執行。

結語

一開始覺得正則表達式中那些符號有點複雜,像是 \d, \w, 還有 +、* 之類的符號,感覺有點難懂。但當我開始用它來解決問題時,突然發現這些符號其實比很多行的程式碼還要簡潔許多(但感覺可讀性沒有很高QQ),能很快匹配到我們想要的資料。無論是找出某種格式的文字,還是從大段文本中挑出特定的東西,正則表達式都很方便。

而這次小專題的主題也是我們生活中很常見的情境,所以我不僅學到了如何使用正則表達式來過濾敏感內容,未來還能實際應用在網站或社交平台的留言過濾系統中。

以後如果遇到資料過濾、清理,甚至 AI 訓練的前期處理,我想正則表達式都會是必不可少的工具><


上一篇
從0開始學習Python---簡易 AI 聊天系統
下一篇
從0開始學習Python---數據圖表設計、氣象分析圖表
系列文
從0開始學習Python-為未來學習AI奠定基礎27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言