iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

第 24 天:正規表示式的應用

課程目標:

今天的主題是正規表示式(Regular Expressions, Regex)。正規表示式是一種強大的工具,用來匹配和操作字串。它廣泛應用於文本處理、數據清洗、驗證格式等方面。本課程將帶領 0 基礎的 Python 學生學習正規表示式的基本語法及其在 Python 中的應用。


1. 什麼是正規表示式?

正規表示式是一種用來描述字串模式的語法規則。通過正規表示式,可以快速檢查某個字串是否符合某個模式,或進行更複雜的字串處理操作。

例子:匹配郵箱地址

正規表示式能夠用來檢查輸入的郵箱格式是否正確,比如以下的正則模式可用來匹配簡單的郵箱格式:

^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

2. Python 中的 re 模組

Python 提供了內建的 re 模組來支持正規表示式的功能。以下是一些常用的 re 模組函數:

  • re.search(): 在字串中搜尋匹配的模式,返回第一個匹配結果。
  • re.match(): 檢查字串是否從開頭匹配正規表示式。
  • re.findall(): 返回所有與模式匹配的字串列表。
  • re.sub(): 將字串中匹配到的部分替換為其他字串。

3. 基本語法與字符集

常用的正規表示式符號及其含義:

符號 含義
. 匹配任意單個字符
^ 匹配字串的開頭
$ 匹配字串的結尾
* 匹配前一個字符 0 次或多次
+ 匹配前一個字符 1 次或多次
? 匹配前一個字符 0 次或 1 次
[] 字符集,匹配括號內的任意一個字符
` `
\d 匹配任意數字字符(等價於 [0-9]
\w 匹配任意字母、數字或下劃線
\s 匹配任意空白字符(空格、換行符等)

例子:匹配數字

import re

pattern = r'\d+'
text = "今天的溫度是 23 度"
match = re.findall(pattern, text)
print(match)  # 輸出:['23']

4. 分組與捕獲

在正規表示式中,括號 () 用來創建分組,允許你提取匹配結果中的特定部分。

例子:提取電話號碼中的區碼和號碼

import re

pattern = r'(\d{3})-(\d{7})'
text = "我的電話號碼是 123-4567890"
match = re.search(pattern, text)

if match:
    print(f"區碼: {match.group(1)}")
    print(f"號碼: {match.group(2)}")

5. 正則表達式的應用場景

1. 驗證用戶輸入

你可以使用正規表示式來驗證用戶的輸入是否符合特定格式,如郵箱、電話號碼或身份證號碼。

例子:驗證郵箱格式

import re

pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
email = input("請輸入你的郵箱: ")

if re.match(pattern, email):
    print("郵箱格式正確")
else:
    print("郵箱格式不正確")

2. 替換字串

正規表示式可以用來替換文本中不符合規範的部分。例如,在文本中替換掉所有的數字。

import re

text = "今天是 2024 年 10 月 3 日"
new_text = re.sub(r'\d+', 'X', text)
print(new_text)  # 輸出:今天是 X 年 X 月 X 日

6. 實作練習

練習 1: 撰寫正規表示式來檢查密碼是否符合以下要求:

  • 必須包含至少一個大寫字母、一個小寫字母和一個數字
  • 長度至少為 8 個字符

練習 2: 撰寫一個程式,找出文本中所有符合日期格式 YYYY-MM-DD 的日期。


這些練習主要涉及正規表示式的使用,來檢查密碼的複雜性以及解析日期格式。正規表示式是用來檢查、匹配和操作字符串的強大工具,尤其在處理模式匹配時非常有效。下面是詳細步驟和範例代碼。


練習 1:撰寫正規表示式來檢查密碼是否符合要求
要求:
  1. 密碼必須包含至少一個大寫字母、一個小寫字母和一個數字。
  2. 密碼的長度至少為 8 個字符。
步驟:
  1. 使用 Python 的 re 模組來定義一個正規表示式,檢查密碼是否符合上述條件。
  2. 創建函數來判斷密碼是否符合要求。
範例代碼:
import re

def is_valid_password(password):
    # 定義正規表示式,至少一個大寫字母、一個小寫字母、一個數字,且長度至少為8
    pattern = r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d]{8,}$'
    
    # 使用 re.match 檢查密碼是否符合條件
    if re.match(pattern, password):
        return True
    else:
        return False

# 測試範例
password = input("請輸入密碼: ")
if is_valid_password(password):
    print("密碼有效")
else:
    print("密碼無效,必須包含至少一個大寫字母、一個小寫字母、一個數字,且至少8個字符")
解釋:
  • (?=.*[A-Z]):檢查是否包含至少一個大寫字母。
  • (?=.*[a-z]):檢查是否包含至少一個小寫字母。
  • (?=.*\d):檢查是否包含至少一個數字。
  • {8,}:密碼的最小長度為 8。
  • 正規表示式會檢查整個密碼是否符合這些條件,並返回相應的結果。

練習 2:撰寫一個程式,找出文本中所有符合日期格式 YYYY-MM-DD 的日期
要求:
  1. 從文本中找出所有符合格式的日期,格式必須為 YYYY-MM-DD
步驟:
  1. 使用正規表示式來匹配 YYYY-MM-DD 格式的日期。
  2. 創建函數來從文本中提取這些日期。
範例代碼:
import re

def find_dates(text):
    # 定義正規表示式來匹配日期格式 YYYY-MM-DD
    pattern = r'\b\d{4}-\d{2}-\d{2}\b'
    
    # 使用 re.findall 來找出所有符合條件的日期
    dates = re.findall(pattern, text)
    
    return dates

# 測試範例文本
text = "今天是 2024-10-03,昨天是 2024-10-02,明天是 2024-10-04,這裡還有一個日期 2023-05-14。"
found_dates = find_dates(text)

print("找到的日期有:", found_dates)
解釋:
  • \b:匹配單詞邊界,避免匹配到不完整的日期(如 20241003)。
  • \d{4}:匹配 4 位數字,代表年份。
  • \d{2}:匹配 2 位數字,代表月份和日期。
  • 正規表示式會掃描整個文本,並找出所有符合 YYYY-MM-DD 格式的日期。

這兩個練習通過正規表示式的應用,教你如何驗證字符串格式、提取數據並完成一些常見的文本處理任務。


7. 小結

今天我們學習了正規表示式的基本概念及其在 Python 中的應用。正規表示式是一個非常強大且靈活的工具,能夠幫助我們處理各種複雜的文本操作,如驗證格式、提取數據或替換文本等。


明日預告:Python的單元測試與自動化測試


上一篇
跟著 ChatGPT成為程式大佬!Python 上下文管理器
下一篇
跟著 ChatGPT成為程式大佬!Python 單元測試與自動化測試
系列文
如果讓chatgpt參加iThome鐵人賽,他竟然寫出...!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言