Python正則表達式全攻略
一、正則表達式基礎
1. 什么是正則表達式?
- 用于描述字符串匹配規則的表達式
- 廣泛應用于文本處理、表單驗證、數據清洗等領域
2. Python中的re模塊
import re
3. 基礎語法
字符 | 說明 | 示例 |
---|---|---|
. | 匹配任意字符(除換行) | a.c → abc |
\d | 數字 [0-9] | \d\d → 42 |
\D | 非數字 | \D → a |
\w | 字母數字下劃線 | \w+ → Ab3_ |
\W | 非單詞字符 | \W → % |
\s | 空白字符 | \s → 空格 |
\S | 非空白字符 | |
^ | 字符串開始 | ^abc |
$ | 字符串結束 | xyz$ |
二、量詞與分組
1. 量詞
* # 0次或多次
+ # 1次或多次
? # 0次或1次
{n} # 正好n次
{n,} # 至少n次
{n,m} # n到m次
2. 分組與或運算
() # 捕獲分組
(?:) # 非捕獲分組
| # 或運算
(?P<name>) # 命名分組
三、re模塊常用方法
1. 匹配方法
re.match() # 從字符串起始位置匹配
re.search() # 掃描整個字符串
re.findall() # 返回所有匹配結果
re.finditer() # 返回迭代器
re.sub() # 替換匹配內容
2. 使用示例
text = "Phone: 123-456-7890, 555-1234"# 查找所有電話號碼
numbers = re.findall(r'\d{3}-\d{3}-\d{4}', text)# 替換電話號碼格式
new_text = re.sub(r'(\d{3})-(\d{3})-(\d{4})', r'(\1) \2-\3', text)
四、進階技巧
1. 編譯正則表達式
pattern = re.compile(r'\b[A-Za-z]+\b')
matches = pattern.findall(text)
2. 標志參數
re.IGNORECASE # 忽略大小寫
re.MULTILINE # 多行模式
re.DOTALL # 使.匹配換行符
3. 貪婪與非貪婪
.* # 貪婪匹配
.*? # 非貪婪匹配
4. 前后斷言
(?=exp) # 正向后行斷言
(?!exp) # 負向后行斷言
(?<=exp) # 正向前行斷言
(?<!exp) # 負向前行斷言
五、實戰案例
1. 郵箱驗證
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
is_valid = re.match(email_pattern, "user@example.com")
2. 提取網頁鏈接
html = '<a href="https://example.com">Link</a>'
links = re.findall(r'href=["\'](https?://.*?)["\']', html)
3. 日志分析
log = "2023-08-20 14:30:45 [ERROR] Connection timeout"
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) \[(\w+)\] (.*)'
match = re.match(pattern, log)
4. 數據清洗
dirty_data = "Price: $1,234.56 (50% OFF!)"
clean = re.sub(r'[^\d.]', '', dirty_data) # 保留數字和小數點
5. 復雜密碼驗證
password_pattern = r'''
^(?=.*[A-Z]) # 至少一個大寫字母
(?=.*[a-z]) # 至少一個小寫字母
(?=.*\d) # 至少一個數字
(?=.*[@$!%*?&]) # 至少一個特殊字符
[A-Za-z\d@$!%*?&]{8,}$ # 總長度至少8
'''
is_strong = re.search(password_pattern, "Passw0rd!", re.VERBOSE)
六、性能優化
- 預編譯常用正則表達式
- 避免過度使用.*
- 使用原子組防止回溯爆炸
- 優先使用具體字符集代替.
- 合理使用^和$錨定
七、常見問題
- 特殊字符未轉義(如.需要寫成.)
- 貪婪匹配導致意外結果
- 忘記處理多行模式
- 分組引用錯誤(\1 vs $1)
- Unicode字符處理
八、調試工具推薦
- RegExr 在線測試工具
- Python的re.DEBUG標志
- regex101 可視化分析
通過這個教程,你可以逐步掌握:
- 從基礎匹配到高級模式的應用
- 常見文本處理場景的解決方案
- 正則表達式性能優化技巧
- 復雜模式的設計與調試方法