在Python中使用正則表達式主要通過內置的re
模塊實現。正則表達式用于匹配、查找、替換字符串中的特定模式,是處理文本的強大工具。以下是使用正則表達式的核心方法和示例:
一、基本用法步驟
- 導入re模塊:
import re
- 定義正則表達式模式:用字符串表示,特殊字符需轉義(如
\d
表示數字) - 使用re模塊函數:如
match()
、search()
、findall()
等處理文本
二、常用函數及示例
1. re.match(pattern, string)
- 從字符串開頭匹配模式,成功返回匹配對象,否則返回
None
import re# 匹配以"Hello"開頭的字符串
result = re.match(r"Hello", "Hello World")
if result:print("匹配成功:", result.group()) # 輸出: 匹配成功: Hello
else:print("匹配失敗")
2. re.search(pattern, string)
- 在整個字符串中查找第一個匹配項,不要求從開頭開始
# 查找字符串中的數字
result = re.search(r"\d+", "年齡: 25, 身高: 180")
if result:print("找到數字:", result.group()) # 輸出: 找到數字: 25
3. re.findall(pattern, string)
- 查找字符串中所有匹配的子串,返回列表
# 提取所有郵箱地址
text = "聯系我們: a@example.com, b@test.org"
emails = re.findall(r"\w+@\w+\.\w+", text)
print(emails) # 輸出: ['a@example.com', 'b@test.org']
4. re.sub(pattern, repl, string)
- 替換字符串中所有匹配的子串,返回替換后的新字符串
# 將所有數字替換為"*"
text = "密碼: 123456, 驗證碼: 789"
new_text = re.sub(r"\d+", "*", text)
print(new_text) # 輸出: 密碼: *, 驗證碼: *
5. re.split(pattern, string)
- 根據匹配的模式分割字符串,返回列表
# 用逗號或空格分割字符串
text = "apple, banana orange; grape"
parts = re.split(r"[,; ]+", text) # 匹配逗號、分號或空格(可多個)
print(parts) # 輸出: ['apple', 'banana', 'orange', 'grape']
三、常用正則表達式符號
符號 | 含義 | 示例 |
---|---|---|
. | 匹配任意字符(除換行) | a.b 匹配 “aab”、“acb” |
* | 前面元素出現0次或多次 | ab* 匹配 “a”、“ab”、“abb” |
+ | 前面元素出現1次或多次 | ab+ 匹配 “ab”、“abb” |
? | 前面元素出現0次或1次 | ab? 匹配 “a”、“ab” |
^ | 匹配字符串開頭 | ^Hello 匹配以Hello開頭 |
$ | 匹配字符串結尾 | world$ 匹配以world結尾 |
[] | 字符集,匹配其中任意一個字符 | [abc] 匹配 “a”、“b”、“c” |
\d | 匹配數字(等價于[0-9] ) | \d{3} 匹配3位數字 |
\w | 匹配字母、數字、下劃線 | \w+ 匹配單詞 |
() | 分組,提取匹配的子串 | (\d+)-(\d+) 匹配"123-456" |
四、進階技巧:編譯正則表達式
對于頻繁使用的模式,可先用re.compile()
編譯,提高效率:
# 編譯模式
pattern = re.compile(r"\d{3}-\d{4}") # 匹配如"123-4567"的格式# 重復使用
text1 = "電話: 123-4567"
text2 = "傳真: 890-1234"
print(pattern.search(text1).group()) # 123-4567
print(pattern.search(text2).group()) # 890-1234
五、實際案例:驗證手機號
def is_valid_phone(phone):# 匹配中國大陸手機號(11位數字,以1開頭)pattern = r"^1[3-9]\d{9}$"return bool(re.match(pattern, phone))print(is_valid_phone("13812345678")) # True
print(is_valid_phone("1234567890")) # False(長度不足)
通過re
模塊,你可以靈活處理各種文本提取、驗證和替換需求,熟練掌握后能極大提升文本處理效率。