文章

第23天:正則表達式

課程簡介

正則表達式(Regular Expression,簡稱 Regex)是一種用於字串模式匹配和處理的工具。它在處理文字時非常強大,可以用來搜尋、替換、或驗證特定的字串模式。Python 提供了內建的 re 模組來支持正則表達式操作。在今天的課程中,我們將學習正則表達式的基本語法和常見的應用場景。


學習內容

1. re 模組的基本操作

在 Python 中,re 模組提供了多種用於正則表達式的函數:

  • re.search():搜尋與正則表達式匹配的第一個結果。
  • re.findall():找出所有匹配的結果。
  • re.match():檢查字串開頭是否符合正則表達式。
  • re.sub():替換符合條件的字串。

範例:

1
2
3
4
5
6
import re

# 搜尋字串中是否有 "cat"
result = re.search(r'cat', 'I have a cat.')
if result:
    print("找到匹配")

2. 基本正則表達式語法

2.1 字符匹配

  • .:匹配任意單一字符。
  • []:匹配括號內任意字符。例如,[a-z] 匹配小寫字母,[0-9] 匹配數字。
  • ^:匹配字串的開頭。例如,^Hello 匹配以 “Hello” 開頭的字串。
  • $:匹配字串的結尾。例如,end$ 匹配以 “end” 結尾的字串。
  • \:用來轉義特殊字符。

範例:

1
2
3
result = re.search(r'[0-9]', 'I have 2 cats')
if result:
    print("找到數字")

2.2 重複匹配

  • *:匹配前面的字符零次或多次。例如,a* 匹配零個或多個 a
  • +:匹配前面的字符一次或多次。例如,a+ 匹配至少一個 a
  • ?:匹配前面的字符零次或一次。例如,a? 匹配零個或一個 a
  • {n}:匹配前面的字符恰好 n 次。例如,a{3} 匹配三個 a
  • {n,m}:匹配前面的字符至少 n 次,最多 m 次。

範例:

1
2
3
4
# 匹配至少一個數字
result = re.search(r'\d+', 'Order number is 12345')
if result:
    print("找到數字:", result.group())

2.3 分組與選擇

  • |:表示 “或” 的關係。例如,cat|dog 匹配 “cat” 或 “dog”。
  • ():用來分組。例如,(ab)+ 匹配 “ab” 的一次或多次出現。

範例:

1
2
3
result = re.search(r'(cat|dog)', 'I have a dog.')
if result:
    print("找到動物:", result.group())

3. 常見應用場景

3.1 驗證 Email 地址

正則表達式可以用來驗證 Email 格式是否正確。

範例:

1
2
3
4
5
6
email = 'test@example.com'
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if re.match(pattern, email):
    print("有效的 Email")
else:
    print("無效的 Email")

3.2 搜尋電話號碼

使用正則表達式可以從字串中提取電話號碼。

範例:

1
2
3
4
5
text = 'My phone number is 123-456-7890.'
pattern = r'\d{3}-\d{3}-\d{4}'
phone = re.search(pattern, text)
if phone:
    print("找到電話號碼:", phone.group())

3.3 字串替換

可以使用 re.sub() 將字串中的特定部分替換為其他內容。

範例:

1
2
3
text = 'I love cats. Cats are great.'
new_text = re.sub(r'cat', 'dog', text, flags=re.I)
print(new_text)  # 輸出: 'I love dogs. Dogs are great.'

4. 常用標誌(Flags)

  • re.IGNORECASEre.I:忽略大小寫。
  • re.MULTILINEre.M:多行模式,^$ 匹配每一行的開頭和結尾。
  • re.DOTALLre.S:讓 . 匹配換行符。

範例:

1
2
3
result = re.search(r'cat', 'I love CATs', flags=re.I)
if result:
    print("忽略大小寫匹配")

教學重點

  • 正則表達式的基本語法:理解如何使用字符匹配、重複匹配及分組來進行模式匹配。
  • re 模組的基本操作:學會使用 search()match()findall()sub() 等函數來處理字串。
  • 正則表達式的應用場景:能夠使用正則表達式進行資料驗證、搜尋和替換。
  • 常用標誌:了解如何使用 IGNORECASEMULTILINE 等標誌來調整匹配行為。

任務

  1. 使用正則表達式匹配一個 Email 地址,並驗證其格式是否正確。
  2. 編寫一個程式,使用正則表達式從一段文字中提取所有的電話號碼。
  3. 使用 re.sub() 將一段文字中的所有 “Python” 替換成 “Java”。
  4. 使用正則表達式匹配字串中的所有大寫字母,並將其轉換為小寫。
本文章以 CC BY 4.0 授權