正则表达式的应用
一、什么是正则表达式(Regular Expression)
正则表达式(简称Regex)是一种用于描述字符串模式的语法规则。
它广泛应用于文本匹配、检索、提取、替换等操作。无论是从日志中提取 IP 地址,验证邮箱格式,还是分割复杂的自然语言文本,正则表达式都能发挥极大的作用。
二、正则表达式的使用场景
使用场景 |
实际用途说明 |
数据验证 |
验证用户名、密码、邮箱、手机号格式是否合法 |
文本提取 |
从网页源码、日志中提取链接、手机号、邮箱等信息 |
敏感词过滤 |
识别并替换掉包含敏感内容的字符串 |
分词和字符串切割 |
将中文古诗按标点切分、按空格分句等 |
爬虫和数据清洗 |
抓取内容后快速清洗 HTML 标签、注释或冗余符号 |
IDE/编辑器高级查找替换 |
例如 VSCode / Sublime / Notepad++ 的“正则查找”功能 |
三、正则表达式语法基础教学
1. 字符匹配符
语法 |
说明 |
示例 |
. |
匹配任意一个字符 |
a.b → acb , arb |
\w |
匹配字母数字下划线 |
\w+ → abc_123 |
\d |
匹配数字 |
\d{4} → 2025 |
\s |
匹配空白字符 |
a\sb → a b |
\b |
匹配单词边界 |
\bcat\b 匹配 cat is cute 中的 cat ,但不匹配 catalog |
2. 次数控制
语法 |
含义 |
示例 |
* |
匹配0次或多次 |
ab*c → ac , abc , abbbc |
+ |
匹配1次或多次 |
ab+c → abc , abbbc |
? |
匹配0次或1次 |
ab?c → ac , abc |
{n} |
匹配n次 |
\d{6} → 123456 |
{n,} |
匹配至少n次 |
\d{3,} → 123 , 1234 |
{m,n} |
匹配m到n次 |
\d{3,5} → 123 , 12345 |
3. 分组与逻辑选择
语法 |
含义 |
示例 |
|
|
() |
捕获分组 |
(\d{3})-(\d{4}) |
|
|
(?:...) |
非捕获分组 |
不保留子组结果 |
|
|
`exp1 |
exp2` |
或(分支) |
`abc |
123` 可匹配任一 |
4. 断言(高级)
语法 |
类型 |
示例 |
用途 |
(?=exp) |
正向先行断言 |
\d(?=元) 匹配“元”前的数字 |
提取价格前的数字 |
(?<=exp) |
正向后行断言 |
(?<=编号:)\d+ 匹配“编号:”之后的数字 |
提取标签后的数据 |
(?!exp) |
负向先行断言 |
abc(?!123) |
不匹配后面为123的abc |
(?<!exp) |
负向后行断言 |
(?<!前缀)123 |
不匹配前缀123的123 |
四、Python 中的正则表达式实战讲解
Python 中提供 re
模块处理正则表达式,以下是常用函数的教学解析:
1. re.match()
vs re.search()
import re
print(re.match(r'\d+', '2025年')) # 从开头开始匹配,成功
print(re.match(r'\d+', '年2025')) # 不从开头匹配,返回None
print(re.search(r'\d+', '年2025')) # 成功,匹配到2025
2. re.findall()
与 re.finditer()
text = "手机号: 13800001111, 15600002222"
pattern = r'1[3-9]\d{9}'
print(re.findall(pattern, text)) # 返回所有匹配字符串组成的列表
for m in re.finditer(pattern, text):
print(m.group()) # 每次返回一个匹配对象
3. re.sub()
替换敏感词(过滤脏话)
dirty = 'fuck this shit'
cleaned = re.sub(r'fuck|shit', '*', dirty, flags=re.I)
print(cleaned) # 输出:* this *
4. re.split()
字符串切割
poem = '床前明月光,疑是地上霜。举头望明月,低头思故乡。'
sentences = re.split(r'[,。]', poem)
print([s for s in sentences if s]) # 移除空串
五、正则表达式的最佳实践
✅ 最佳实践建议
做法 |
建议说明 |
使用原始字符串 |
例如 r'\d{3}' 而非 '\\d{3}' ,防止转义混乱 |
简化正则表达式 |
不要过度嵌套,拆解为多个步骤更易调试 |
用分组提高可读性 |
通过() 将复杂结构分段,利于维护 |
加上注释 |
使用 (?#注释) 或代码层注释解释每段逻辑 |
借助工具测试 |
如 regex101.com 或 runoob 正则测试工具 |
考虑边界和非法输入 |
使用 ^$ 和 \b 明确限制 |
六、常见正则表达式模板库(参考)
场景 |
模板示例 |
|
|
|
|
|
|
邮箱地址 |
\b[\w.-]+@[\w.-]+\.\w+\b |
|
|
|
|
|
|
中国手机号 |
1[3-9]\d{9} |
|
|
|
|
|
|
身份证号 |
`\d{15} |
\d{17}[\dXx]` |
|
|
|
|
|
IPv4地址 |
`((25[0-5] |
2[0-4]\d |
1\d{2} |
[1-9]?\d).){3}(25[0-5] |
2[0-4]\d |
1\d{2} |
[1-9]?\d)` |
日期格式 |
\d{4}-\d{2}-\d{2} |
|
|
|
|
|
|
七、小结:如何学好正则表达式
- 理解而非死记:理解每个元字符的意义是关键。
- 多练习多试错:调试正则表达式最好的方式是在线测试和写小脚本。
- 场景驱动:从自己的任务出发解决实际问题,例如文本处理、日志分析。
- 积累套路:收藏常用表达式,形成自己的模板库。
- 结合工具:掌握正则表达式调试工具,减少脑力负担。
附:推荐工具和资源
如你有特定使用场景(如爬虫、数据清洗、日志分析等),我可以继续为你量身定制更深度的正则表达式教学。是否需要进一步案例化讲解?