2025年10月13日 星期一

[水井USR創新教材]Python一下用水井三寶來看字串正規表示式的用法

圖:2025/10/13 在竹山鎮小鎮文創的協助下,尚虎雲在台西客運中展出作品,水井三寶是其中一件作品。

以下是採Grok AI生成的。 

以「水井三寶」(烏龜、白馬、姻緣花)為主題,設計一個 Python 小範例來展示正規表示式(Regular Expression, regex)的應用。這個範例會結合物件導向程式設計(OOP)和正規表示式,聚焦於如何使用 re 模組來處理與水井三寶相關的文字資料。每個寶物會有一個專屬的正規表示式模式,用於解析特定格式的吉祥訊息,並展示 OOP 的封裝特性來管理正規表示式邏輯。

情境設定

假設我們有一段文字,包含水井三寶的吉祥訊息,例如:

  • 「烏龜祝福:長壽100年」
  • 「白馬祝福:奔馳500公里」
  • 「姻緣花祝福:愛情99朵」 我們希望用正規表示式提取每個寶物的名稱和數值(例如年數、公里數、朵數),並透過類來管理這些模式和處理邏輯。

範例程式碼

以下是一個完整的 Python 範例,結合正規表示式和 OOP,並使用「水井三寶」來解析吉祥訊息。程式碼使用封裝來管理正規表示式,並提供簡單的處理方法。


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import re

class Treasure:
    """基類:定義水井三寶的共同行為"""
    def __init__(self, name):
        self.name = name
        self._pattern = None  # 保護屬性:正規表示式模式

    def extract_value(self, message):
        """提取訊息中的數值,使用正規表示式"""
        if not self._pattern:
            return f"{self.name} 尚未定義正規表示式!"
        match = re.match(self._pattern, message)
        if match:
            return f"{self.name} 提取到:{match.group(1)}"
        return f"{self.name} 無法解析訊息:{message}"

class Turtle(Treasure):
    """烏龜:解析 '長壽X年' 的訊息"""
    def __init__(self):
        super().__init__("烏龜")
        # 正規表示式:匹配 "烏龜祝福:長壽數字年"
        self._pattern = r"烏龜祝福:長壽(\d+)年"

class WhiteHorse(Treasure):
    """白馬:解析 '奔馳X公里' 的訊息"""
    def __init__(self):
        super().__init__("白馬")
        # 正規表示式:匹配 "白馬祝福:奔馳數字公里"
        self._pattern = r"白馬祝福:奔馳(\d+)公里"

class MarriageFlower(Treasure):
    """姻緣花:解析 '愛情X朵' 的訊息"""
    def __init__(self):
        super().__init__("姻緣花")
        # 正規表示式:匹配 "姻緣花祝福:愛情數字朵"
        self._pattern = r"姻緣花祝福:愛情(\d+)朵"

# 測試範例
if __name__ == "__main__":
    # 創建水井三寶實例
    turtle = Turtle()
    horse = WhiteHorse()
    flower = MarriageFlower()

    # 測試訊息
    messages = [
        "烏龜祝福:長壽100年",
        "白馬祝福:奔馳500公里",
        "姻緣花祝福:愛情99朵",
        "烏龜祝福:無效訊息",
    ]

    # 遍歷寶物和訊息,展示正規表示式提取
    treasures = [turtle, horse, flower]
    for treasure in treasures:
        print(f"\n測試 {treasure.name}:")
        for msg in messages:
            print(treasure.extract_value(msg))

執行結果:
測試 烏龜:
烏龜 提取到:100
烏龜 無法解析訊息:白馬祝福:奔馳500公里
烏龜 無法解析訊息:姻緣花祝福:愛情99朵
烏龜 無法解析訊息:烏龜祝福:無效訊息

測試 白馬:
白馬 無法解析訊息:烏龜祝福:長壽100年
白馬 提取到:500
白馬 無法解析訊息:姻緣花祝福:愛情99朵
白馬 無法解析訊息:烏龜祝福:無效訊息

測試 姻緣花:
姻緣花 無法解析訊息:烏龜祝福:長壽100年
姻緣花 無法解析訊息:白馬祝福:奔馳500公里
姻緣花 提取到:99
姻緣花 無法解析訊息:烏龜祝福:無效訊息

程式碼解析

  1. 正規表示式(Regex)應用
    • 每個子類定義專屬的正規表示式模式,儲存在 _pattern 中:
      • 烏龜:r"烏龜祝福:長壽(\d+)年" 提取年數(例如 "100")。
      • 白馬:r"白馬祝福:奔馳(\d+)公里" 提取公里數(例如 "500")。
      • 姻緣花:r"姻緣花祝福:愛情(\d+)朵" 提取朵數(例如 "99")。
    • 使用 re.match 檢查訊息是否符合模式,並提取括號 (\d+) 中的數字。
  2. 封裝(Encapsulation)
    • _pattern 是保護屬性,儲存每個寶物的正規表示式模式,外部無法直接修改。
    • extract_value 方法封裝了正規表示式的處理邏輯,提供統一的介面。
  3. 繼承(Inheritance)
    • Treasure 是基礎類別,定義了共用的 name 和 extract_value 方法。
    • Turtle、WhiteHorse 和 MarriageFlower 繼承 Treasure,並在 __init__ 中設定各自的正規表示式模式。
  4. 正規表示式的簡單說明
    • \d+:匹配一個或多個數字。
    • ():捕獲括號內的內容,供 match.group(1) 提取。
    • re.match:從字串開頭匹配,確保訊息格式正確。

技術亮點

  • 正規表示式與 OOP 的結合:每個寶物類負責自己的正規表示式模式,符合單一職責原則。
  • 封裝:正規表示式模式和提取邏輯被封裝在類內,外部只需呼叫 extract_value。
  • 可擴展性:可以輕鬆新增其他寶物類,只需定義新的正規表示式模式。

沒有留言:

張貼留言