Python正则表达式完全指南:从入门到精通
一、正则表达式简介
正则表达式(Regular Expression)是用于匹配和处理文本的强大工具,通过特定语法规则实现:
-
文本搜索与匹配
-
数据验证(邮箱、电话等)
-
文本替换与清洗
-
复杂模式提取
-
文本分割
Python通过内置的re
模块提供正则支持,我们先导入模块:
python
复制
import re
二、基础语法详解
1. 字符匹配
模式 | 描述 | 示例 |
---|---|---|
普通字符 | 精确匹配 | python |
. | 匹配任意单个字符 | p.th.n |
\d | 数字(等价[0-9]) | \d{3} |
\D | 非数字 | \D+ |
\w | 单词字符([a-zA-Z0-9_]) | \w{4,} |
\W | 非单词字符 | \W |
\s | 空白字符(空格、换行等) | \s+ |
\S | 非空白字符 | \S |
2. 量词与重复
量词 | 描述 | 示例 |
---|---|---|
* | 0次或多次 | a*b → "b", "aaab" |
+ | 1次或多次 | a+b → "ab", "aaab" |
? | 0次或1次 | colou?r → "color", "colour" |
{n} | 精确n次 | \d{4} → 4位数字 |
{n,} | 至少n次 | \w{3,} → 至少3个字符 |
{n,m} | n到m次 | a{2,4} → "aa", "aaaa" |
3. 字符集合
python
复制
[aeiou] # 匹配任意元音 [^0-9] # 非数字字符 [a-zA-Z] # 所有字母 [0-9a-fA-F] # 十六进制字符
4. 定位符
符号 | 描述 | 示例 |
---|---|---|
^ | 字符串开始 | ^Start |
$ | 字符串结束 | end$ |
\b | 单词边界 | \bword\b |
\B | 非单词边界 | \Bword\B |
5. 转义字符
使用\
转义特殊字符:
python
复制
\. 匹配点号 \\ 匹配反斜杠 \* 匹配星号
三、Python re模块核心方法
1. 常用方法
方法 | 描述 |
---|---|
re.match() | 从字符串起始位置匹配 |
re.search() | 扫描整个字符串查找匹配 |
re.findall() | 返回所有匹配的列表 |
re.finditer() | 返回匹配迭代器 |
re.sub() | 替换匹配内容 |
re.split() | 按模式分割字符串 |
2. 匹配示例
python
复制
# 验证手机号 pattern = r'^1[3-9]\d{9}$' phone = "13812345678" if re.match(pattern, phone): print("Valid phone number") # 提取所有日期 text = "2023-08-15, 2024-12-31" dates = re.findall(r'\d{4}-\d{2}-\d{2}', text) print(dates) # ['2023-08-15', '2024-12-31']
四、高级技巧
1. 分组与捕获
python
复制
# 捕获分组 pattern = r'(\d{4})-(\d{2})-(\d{2})' match = re.search(pattern, "Date: 2023-08-15") if match: print(f"Year: {match.group(1)}, Month: {match.group(2)}") # 非捕获分组(?:) pattern = r'(?:\d{3})-(\d{4})' # 不捕获前3位
2. 贪婪与非贪婪匹配
python
复制
# 贪婪匹配(默认) re.findall(r'<.*>', '<div>text</div>') # 匹配整个字符串 # 非贪婪匹配(加?) re.findall(r'<.*?>', '<div>text</div>') # ['<div>', '</div>']
3. 断言(Lookaround)
断言类型 | 语法 | 示例 |
---|---|---|
正向先行断言 | (?=...) | \d+(?=元) → "100" in "100元" |
负向先行断言 | (?!...) | \d{3}(?!-)\d{4} → 禁止连字符 |
正向后行断言 | (?<=...) | (?<=\$)\d+ → "99" in "$99" |
负向后行断言 | (?<!...) | (?<!-)\d{5} → 排除以-开头的数字 |
五、最佳实践与优化
1. 使用编译模式
python
复制
pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b') emails = pattern.findall(text)
2. 性能优化技巧
-
避免过度使用回溯:
.*
→ 改用更具体的模式 -
使用非捕获组:
(?:...)
代替(...)
-
预编译常用正则表达式
-
尽量使用具体字符集代替
.
3. 常见问题解决
问题:匹配包含特殊字符的文本
python
复制
# 使用re.escape自动转义 danger_str = "file[1].txt" safe_pattern = re.escape(danger_str) + r'_\d+'
问题:多行匹配
python
复制
text = """Start Content line1 Content line2 End""" re.findall(r'^Content.*', text, re.MULTILINE)
六、实用案例集合
1. 邮箱验证
python
复制
pattern = r''' ^ # 开始 [\w.%+-]+ # 用户名 @ [\w.-]+ # 域名 \. [a-zA-Z]{2,} # 顶级域名 $ # 结束 ''' re.compile(pattern, re.VERBOSE)
2. 提取HTML链接
python
复制
html = '<a href="https://example.com">Link</a>' links = re.findall(r'href=["\'](.*?)["\']', html)
3. 密码强度验证
python
复制
# 要求:8-20位,包含大小写字母和数字 pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w!@#$%^&*]{8,20}$'
七、工具与资源推荐
-
在线测试工具:
-
RegExr
-
Regex101
-
-
可视化工具:
-
Regexper
-
-
进阶学习:
-
《精通正则表达式》
-
Python官方re模块文档
-
通过本教程,您已掌握Python正则表达式的核心知识与实用技巧。建议通过实际项目练习巩固,遇到复杂匹配时逐步拆解模式,善用测试工具进行验证。正则表达式需要实践积累,持续练习将助您成为文本处理高手!