今天的主題是正規表示式(Regular Expressions, Regex)。正規表示式是一種強大的工具,用來匹配和操作字串。它廣泛應用於文本處理、數據清洗、驗證格式等方面。本課程將帶領 0 基礎的 Python 學生學習正規表示式的基本語法及其在 Python 中的應用。
正規表示式是一種用來描述字串模式的語法規則。通過正規表示式,可以快速檢查某個字串是否符合某個模式,或進行更複雜的字串處理操作。
例子:匹配郵箱地址
正規表示式能夠用來檢查輸入的郵箱格式是否正確,比如以下的正則模式可用來匹配簡單的郵箱格式:
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
re
模組Python 提供了內建的 re
模組來支持正規表示式的功能。以下是一些常用的 re
模組函數:
re.search()
: 在字串中搜尋匹配的模式,返回第一個匹配結果。re.match()
: 檢查字串是否從開頭匹配正規表示式。re.findall()
: 返回所有與模式匹配的字串列表。re.sub()
: 將字串中匹配到的部分替換為其他字串。常用的正規表示式符號及其含義:
符號 | 含義 |
---|---|
. |
匹配任意單個字符 |
^ |
匹配字串的開頭 |
$ |
匹配字串的結尾 |
* |
匹配前一個字符 0 次或多次 |
+ |
匹配前一個字符 1 次或多次 |
? |
匹配前一個字符 0 次或 1 次 |
[] |
字符集,匹配括號內的任意一個字符 |
` | ` |
\d |
匹配任意數字字符(等價於 [0-9] ) |
\w |
匹配任意字母、數字或下劃線 |
\s |
匹配任意空白字符(空格、換行符等) |
例子:匹配數字
import re
pattern = r'\d+'
text = "今天的溫度是 23 度"
match = re.findall(pattern, text)
print(match) # 輸出:['23']
在正規表示式中,括號 ()
用來創建分組,允許你提取匹配結果中的特定部分。
例子:提取電話號碼中的區碼和號碼
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)}")
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 日
練習 1: 撰寫正規表示式來檢查密碼是否符合以下要求:
練習 2: 撰寫一個程式,找出文本中所有符合日期格式 YYYY-MM-DD
的日期。
這些練習主要涉及正規表示式的使用,來檢查密碼的複雜性以及解析日期格式。正規表示式是用來檢查、匹配和操作字符串的強大工具,尤其在處理模式匹配時非常有效。下面是詳細步驟和範例代碼。
re
模組來定義一個正規表示式,檢查密碼是否符合上述條件。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。YYYY-MM-DD
的日期YYYY-MM-DD
。YYYY-MM-DD
格式的日期。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
格式的日期。這兩個練習通過正規表示式的應用,教你如何驗證字符串格式、提取數據並完成一些常見的文本處理任務。
今天我們學習了正規表示式的基本概念及其在 Python 中的應用。正規表示式是一個非常強大且靈活的工具,能夠幫助我們處理各種複雜的文本操作,如驗證格式、提取數據或替換文本等。
明日預告:Python的單元測試與自動化測試