python正则表达式重在解决实际文本问题:1.手机号提取需兼顾格式与防误匹配;2.日志清洗用re.sub去除时间戳和IP;3.文件重命名靠捕获组调换顺序;4.邮箱识别需边界控制并生成mailto链接。

Python正则表达式不是背语法,而是解决实际文本问题的工具。掌握几个典型场景的写法,比记满页符号更有用。
提取手机号:兼顾常见格式和防误匹配
国内手机号通常为11位,以1开头,第二位常见3-9;但要注意避开“110”“119”等特殊号段,也别把带分隔符的字符串(如138-1234-5678)错当有效号码。
- 基础匹配:
r'1[3-9]d{9}'—— 精准抓纯数字11位手机号 - 支持空格/短横线:
r'1[3-9]d{2}[-s]?d{4}[-s]?d{4}',注意?表示前面的分隔符可有可无 - 防止匹配到更长数字中的子串:用 b(词边界)包住,如
r'b1[3-9]d{9}b'
清洗日志行:去掉时间戳和IP,保留核心信息
服务器日志常形如 [2024-03-15 14:22:08] 192.168.1.100 "GET /api/user http/1.1" 200,想只留请求路径和状态码。
- 先用
re.sub()去掉开头时间:re.sub(r'^[.*?]s+', '', line) - 再删IP和引号包裹的请求行:
re.sub(r'd+.d+.d+.d+s+"[^"]*"s+', '', line) - 组合起来更简洁:
re.sub(r'^[.*?]s+d+.d+.d+.d+s+"[^"]*"s+', '', line)
批量重命名文件:从“report_20240315_v2.txt”改成“2024-03-15-report-v2.txt”
关键在捕获年月日并插入分隔符,同时调换字段顺序。
立即学习“Python免费学习笔记(深入)”;
- 匹配原名结构:
r'report_(d{4})(d{2})(d{2})_v(d+).txt',括号用于分组捕获 - 替换为:
r'1-2-3-report-v4.txt',1 2 3 4 对应四个捕获组 - 完整示例:
re.sub(r'report_(d{4})(d{2})(d{2})_v(d+).txt', r'1-2-3-report-v4.txt', filename)
识别并高亮邮箱:在html中给邮箱加mailto链接
不是简单找@,要确保前后是合理字符边界,避免匹配到“abc@def@ghi”或“email@test.”这种无效串。
- 推荐邮箱模式:
r'b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}b' - 配合
re.sub()生成链接:re.sub(r'(b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}b)', r'<a href="https://www.php.cn/link/8b4992492aec60aac6ba3fd5ee5d93ec">1</a>', text) - 注意:真实项目建议用 email-validator 库校验,正则仅作初步筛选