正则表达式
re 模块常用函数、分组/命名组、贪婪/非贪婪、编译优化
正则表达式
正则表达式是处理文本的强大工具——匹配、查找、替换、验证格式,全靠它。
学完本章你将掌握: re 模块、常用模式、search/match/findall、sub 替换。
一、re 模块基础
python
import re
text = "我的电话是 138-1234-5678,办公室是 010-87654321"
# search:搜索第一个匹配
match = re.search(r"\d{3}-\d{4}-\d{4}", text)
if match:
print(match.group()) # 138-1234-5678
# findall:找到所有匹配
phones = re.findall(r"\d+-\d+", text)
print(phones) # ['138-1234-5678', '010-87654321']
二、常用模式
| 模式 | 含义 | 示例 |
|---|---|---|
| `\d` | 数字 | `\d{3}` 匹配 3 位数字 |
| `\w` | 字母数字下划线 | `\w+` 匹配单词 |
| `.` | 任意字符 | `a.c` 匹配 abc, a1c |
| `*` | 0次或多次 | `ab*c` 匹配 ac, abc, abbc |
| `+` | 1次或多次 | `ab+c` 匹配 abc, abbc |
| `?` | 0或1次 | `ab?c` 匹配 ac, abc |
| `{n}` | 恰好n次 | `\d{3}` 匹配 3 位数字 |
| `^` | 开头 | `^Hello` |
| `$` | 结尾 | `end$` |
| `[abc]` | 字符集 | `[aeiou]` 元音字母 |
| `\s` | 空白 | 空格、Tab、换行 |
三、常用函数
python
# match:从字符串开头匹配
print(re.match(r"\d+", "123abc")) # 匹配成功
# search:搜索整个字符串
print(re.search(r"\d+", "abc123")) # 匹配成功(match 会失败)
# findall:返回所有匹配的列表
words = re.findall(r"\w+", "hello world python")
print(words) # ['hello', 'world', 'python']
# sub:替换
text = "电话: 13812345678"
masked = re.sub(r"\d{3}\d{4}\d{4}", "***隐藏***", text)
print(masked)
# split:按模式分割
parts = re.split(r"[,\s]+", "a,b c d")
print(parts) # ['a', 'b', 'c', 'd']
四、分组捕获
python
phone = "138-1234-5678"
match = re.search(r"(\d{3})-(\d{4})-(\d{4})", phone)
if match:
print(match.group(1)) # 138
print(match.group(2)) # 1234
print(match.group(3)) # 5678
print(match.groups()) # ('138', '1234', '5678')
五、实战:邮箱验证
python
def is_valid_email(email):
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
return bool(re.match(pattern, email))
print(is_valid_email("test@example.com")) # True
print(is_valid_email("invalid-email")) # False
小结
re.search找第一个,re.findall找全部\d\w.*+是最常用的模式符号()捕获分组,re.sub替换- 正则难以调试时,先用简单模式验证再逐步复杂化