Python 的 re 模組提供強大的正規表示式功能,能有效處理字串操作、資料驗證及網頁爬蟲等任務。正規表示式讓開發者能以彈性方式定義搜尋模式,精準匹配目標字串。透過本文提供的程式碼範例與正規表示式符號解析,讀者可快速上手,並應用於實際開發場景。不同於字串方法的逐字比對,正規表示式提供更進階的模式匹配,能處理更複雜的搜尋與驗證需求,提升程式碼的效率與可讀性。

使用正規表示式進行文字搜尋

問題描述

當您需要在文字中進行複雜的搜尋,尋找特定的模式或字串時,如何使用Python的正規表示式功能來實作這一需求。

解決方案

Python的re模組提供了強大的正規表示式功能,允許您定義和搜尋文字中的模式。以下是一個簡單的例子,展示如何使用正規表示式搜尋文字中的特定字串:

import re

text = "looking forward to finding the word for"
pattern = r"(^|\s)for($|\s)"

match = re.search(pattern, text)

if match:
    print(match.span())

討論

在這個例子中,我們使用re.search()函式搜尋文字中匹配指定模式的字串。模式(^|\s)for($|\s)表示搜尋字串「for」,它可以出現在文字的開頭、結尾或被空白字元包圍。

視覺化圖表

  flowchart TD
    A[文字] --> B[定義模式]
    B --> C[搜尋匹配]
    C --> D[傳回匹配結果]

圖表翻譯

此圖表展示了使用正規表示式搜尋文字的過程。首先,我們有原始文字(A),然後我們定義要搜尋的模式(B)。接下來,使用re.search()函式進行搜尋(C),最後傳回匹配結果(D)。

程式碼解釋

內容解密

在上述程式碼中,re.search()函式傳回一個匹配物件,如果找到匹配的字串,否則傳回None。我們使用if陳述式檢查是否找到匹配,如果找到,則列印匹配的起始和結束位置。

使用正規表示式進行字串搜尋

正規表示式(Regular Expression)是一種強大的工具,能夠幫助我們在字串中搜尋特定的模式。下面,我們將探討如何使用正規表示式來搜尋字串中的特定單詞。

基本概念

首先,我們需要匯入正規表示式模組(re)。然後,我們定義了一個變數 text,其中包含了我們要搜尋的字串。接下來,我們使用 search 函式來搜尋字串中特定的模式。這個模式被定義為一個正規表示式。

正規表示式解析

讓我們仔細看看這個正規表示式:(^|\s)for($|\s)。在這個表示式中,for 是我們要搜尋的單詞。兩邊的括號內包含了特殊的符號,用於指定搜尋的條件。

  • (^|\s):這部分表示「開始」或「空白字元」。其中,^ 代表字串的開始,| 代表「或」,而 \s 代表任何空白字元(包括空格和製表符)。這確保了 for 不會作為其他單詞的一部分被匹配。
  • for:這是我們要搜尋的單詞。
  • ($|\s):這部分表示「結尾」或「空白字元」。其中, $ 代表字串的結尾。這確保了 for 要麼出現在字串的結尾,要麼後面跟著空白字元。

常見正規表示式符號

下面列出了常見的正規表示式符號:

符號含義
.匹配任何單個字元
^匹配字串的開始
$匹配字串的結尾
\d匹配任何數字
\s匹配任何空白字元
\w匹配任何字母或數字
*匹配前面字元零次或多次
+匹配前面字元一次或多次
[]匹配括號內的任何字元

練習和測試

要熟悉正規表示式,最好的方法是使用線上的正規表示式測試工具。這些工具允許你輸入正規表示式和測試字串,然後顯示匹配結果。透過實際操作和測試,你可以更好地理解正規表示式的工作原理,並學習如何建構複雜的搜尋模式。

使用正規表示式進行資料驗證

在處理使用者輸入的資料時,驗證其格式和內容是一個非常重要的步驟。例如,當使用者輸入電子郵件地址時,我們需要確保它符合標準的電子郵件地址格式。這就是正規表示式(Regular Expression)發揮作用的地方。

問題描述

假設我們想要驗證使用者輸入的電子郵件地址是否有效。為了達到這個目的,我們可以使用正規表示式來定義電子郵件地址的格式,並檢查使用者的輸入是否符合這個格式。

解決方案

Python 的 re 模組提供了強大的正規表示式功能。以下是一個簡單的範例,展示如何使用正規表示式來驗證電子郵件地址:

import re

# 定義電子郵件地址的正規表示式
regex = r'^[\w_\.+-]+@[\w_\.-]+\.[\w_-]+$'

while True:
    # 提示使用者輸入電子郵件地址
    text = input("請輸入電子郵件地址:")
    
    # 使用正規表示式檢查輸入的電子郵件地址
    if re.search(regex, text):
        print("有效的電子郵件地址")
    else:
        print("無效的電子郵件地址")

討論

在上面的範例中,我們定義了一個正規表示式 regex 來匹配電子郵件地址的格式。這個正規表示式由幾部分組成:

  • ^ 表示字串的開始。
  • [\w_\.+-]+ 匹配一個或多個字元,包括字母、數字、下劃線、點、加號和減號。
  • @ 匹配 @ 符號。
  • [\w_\.-]+ 匹配一個或多個字元,包括字母、數字、下劃線、點和減號。
  • \. 匹配點符號。
  • [\w_-]+ 匹配一個或多個字元,包括字母、數字、下劃線和減號。
  • $ 表示字串的結束。

當使用者輸入電子郵件地址時,我們使用 re.search() 函式來檢查輸入的字串是否匹配這個正規表示式。如果匹配,則印出 “有效的電子郵件地址”;否則,印出 “無效的電子郵件地址”。

使用正規表示式進行網頁爬蟲

問題描述

您想要撰寫一個 Python 程式,自動從網頁中擷取(爬蟲)資訊。

解決方案

使用正規表示式來匹配網頁 HTML 中的文字。正規表示式對於網頁爬蟲非常有用。網頁爬蟲意味著自動讀取網頁 HTML 中的內容。例如,如果您想要一個 Python 程式自動取得某本文在 Amazon 的排名,您需要能夠從 Amazon 的銷售排名中抓取數字(如圖 7-5 所示)。

步驟解釋

  1. 檢視網頁原始碼:在瀏覽器中檢視網頁的原始碼,找到相關的 HTML 碎片。
  2. 使用正規表示式測試工具:使用線上正規表示式測試工具,測試能夠匹配目標文字的正規表示式。
  3. 撰寫 Python 程式:使用 reurllib.request 模組,讀取網頁內容並使用正規表示式匹配目標文字。

範例程式碼

import re
import urllib.request

# 定義正規表示式
regex = '#([\d,]+) in Books'

# 定義網址
url = 'https://www.amazon.com/dp/1492043222/'

# 讀取網頁內容
text = urllib.request.urlopen(url).read().decode('utf-8')

# 匹配目標文字
match = re.search(regex, text)

# 列印結果
print("The Amazon rank is.....")
print(match.group())

討論

許多網站提供 API(請參考 Recipe 7.21)。如果您想要爬蟲的資訊可以透過 API 取得,那麼使用 API 是更好的方法,因為網頁爬蟲非常依賴於網頁的外觀和文字,這意味著如果網站改版,您可能需要重新設計正規表示式。

相關資源

  • 若要讀取網頁內容,請參考 Recipe 7.13。
  • 若要了解正規表示式基礎,請參考 Recipe 7.23。

從技術架構視角來看,Python 的 re 模組提供了一套完整且強大的正規表示式引擎,能有效處理複雜的字串匹配和操作需求,從簡單的字串搜尋到資料驗證、網頁爬蟲等應用場景都能發揮作用。分析其核心功能,re.search()re.match()re.findall() 等函式提供了多樣化的匹配策略,搭配特殊字元和量詞的使用,能精準定位目標字串。然而,正規表示式的撰寫和除錯並非易事,過於複雜的表示式可能影響可讀性和維護性,也可能導致效能問題。對於初學者,建議從簡單的模式開始練習,並善用線上正規表示式測試工具輔助開發。展望未來,隨著自然語言處理技術的發展,根據機器學習的字串處理方法可能會逐漸成熟,但在可預見的未來,正規表示式仍將是字串處理領域不可或缺的重要工具。對於追求程式碼簡潔和效能的開發者,深入理解和掌握正規表示式仍是提升程式碼品質的關鍵。