以下是採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
姻緣花 無法解析訊息:烏龜祝福:無效訊息
程式碼解析
- 正規表示式(Regex)應用:
- 每個子類定義專屬的正規表示式模式,儲存在 _pattern 中:
- 烏龜:r"烏龜祝福:長壽(\d+)年" 提取年數(例如 "100")。
 - 白馬:r"白馬祝福:奔馳(\d+)公里" 提取公里數(例如 "500")。
 - 姻緣花:r"姻緣花祝福:愛情(\d+)朵" 提取朵數(例如 "99")。
 
 - 使用 re.match 檢查訊息是否符合模式,並提取括號 (\d+) 中的數字。
 
 - 每個子類定義專屬的正規表示式模式,儲存在 _pattern 中:
 - 封裝(Encapsulation):
- _pattern 是保護屬性,儲存每個寶物的正規表示式模式,外部無法直接修改。
 - extract_value 方法封裝了正規表示式的處理邏輯,提供統一的介面。
 
 - 繼承(Inheritance):
- Treasure 是基礎類別,定義了共用的 name 和 extract_value 方法。
 - Turtle、WhiteHorse 和 MarriageFlower 繼承 Treasure,並在 __init__ 中設定各自的正規表示式模式。
 
 - 正規表示式的簡單說明:
- \d+:匹配一個或多個數字。
 - ():捕獲括號內的內容,供 match.group(1) 提取。
 - re.match:從字串開頭匹配,確保訊息格式正確。
 
 
技術亮點
- 正規表示式與 OOP 的結合:每個寶物類負責自己的正規表示式模式,符合單一職責原則。
 - 封裝:正規表示式模式和提取邏輯被封裝在類內,外部只需呼叫 extract_value。
 - 可擴展性:可以輕鬆新增其他寶物類,只需定義新的正規表示式模式。
 
沒有留言:
張貼留言