零基础Python正则表达式教程实战案例

admin python教程 4


是不是很多零基础学 Python 的朋友,一听到 “正则表达式” 就犯怵?“那些一堆乱码似的符号到底啥意思?”“看教程写的规则,一运行要么匹配不到,要么全匹配错了?”“想从文本里提取个手机号、邮箱,结果折腾半天啥也弄不出来?” 别慌,正则表达式看着复杂,其实就像 “文本过滤器”,用对了能帮你快速处理字符串。今天兔子哥就带大家从基础入手,通过几个实战案例学 Python 正则,零基础也能跟着做,一起往下看吧!

先明白:Python 里的正则表达式,到底能帮我们做啥?


很多新手觉得正则是 “高阶技能”,其实日常处理文本根本离不开它。简单说,正则表达式就是一套 “匹配文本的规则”,在 Python 里用re模块实现,能帮你做这些事:
  • 从大段文字里提取关键信息,比如手机号、邮箱、日期
  • 快速清洗杂乱数据,比如去除多余空格、替换特殊符号
  • 验证输入格式对不对,比如检查用户填的手机号是不是 11 位

举个例子,你爬了一段评论文本,里面混着各种手机号,手动找得花半小时;但用正则表达式,一行代码就能把所有手机号全提取出来,效率差太多了。有朋友问:“不学正则行不行?” 当然能,但处理文本时会像没带工具干活,明明能一键搞定的事,非得手动敲半天,对吧?

基础准备:Python 正则核心函数,这几个必须先学会


Python 处理正则主要靠re模块,不用额外安装,直接import re就能用。新手先把这几个核心函数练熟,在线教程里也都是重点讲它们:
函数名作用例子
re.findall提取所有匹配的内容,返回列表re.findall(r"\d+", "abc123def456") → ['123', '456']
re.sub替换匹配的内容re.sub(r"\s+", " ", "a b c") → "a b c"
re.match从字符串开头匹配,返回匹配对象re.match (r"a", "abc") → 匹配成功
re.search在整个字符串找第一个匹配re.search (r"b", "abc") → 匹配成功

兔子哥提醒:re.match只看开头,比如用re.match(r"a", "bac")会返回 None,因为开头是 b 不是 a;而re.search会找整个字符串,这俩新手容易搞混,刚开始用re.findallre.sub更不容易出错。


实战案例一:从文本中提取手机号,新手入门必练


提取手机号是最经典的正则案例,学会这个,基本就懂正则怎么用了。

场景:


有一段文本:“联系我:13800138000,工作电话 13912345678,老家座机 010-12345678”,需要提取里面的手机号(11 位数字,开头 13-19)。

步骤:


  1. 写正则规则:手机号是 11 位数字,开头是 1,第二位 3-9,后面 9 位任意数字,规则是r"1[3-9]\d{9}"
    • 1:开头必须是 1
    • [3-9]:第二位是 3-9(覆盖所有手机号段)
    • \d{9}:后面跟 9 位数字(\d 表示数字,{9} 表示 9 次)

  2. 用 re.findall 提取

python
import retext = "联系我:13800138000,工作电话13912345678,老家座机010-12345678"phone_pattern = r"1[3-9]\d{9}"  # 手机号规则phones = re.findall(phone_pattern, text)print(phones)  # 输出:['13800138000', '13912345678']

易错点:


  • 别漏写r前缀:规则前加r表示原始字符串,避免\d被 Python 当成转义符,写成"1[3-9]\d{9}"可能会出错哦。
  • 座机别误提:这个规则只会匹配 11 位手机号,座机号 “010-12345678” 不会被提取,正好符合需求。



实战案例二:清洗杂乱数据,让文本变整齐


爬来的数据往往有多余空格、特殊符号,用正则清洗特别方便。

场景:


一段用户评论:“这 款 产 品 很 好 用 !😊 推 荐 购 买 ~~”,需要去除多余空格、表情和特殊符号。

步骤:


  1. 去除多余空格:用re.sub把多个空格换成一个空格。
  2. 去除特殊符号和表情:保留中文、英文、数字和正常标点。

python
import retext = "  这  款 产 品 很 好 用 !😊 推 荐 购 买 ~~  "# 第一步:去除多余空格clean_text = re.sub(r"\s+", " ", text).strip()  # strip()去掉首尾空格# 第二步:去除特殊符号和表情(只保留中文、英文、数字、空格和常用标点)clean_text = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9 ,.!?]", "", clean_text)print(clean_text)  # 输出:"这款产品很好用!推荐购买"

小技巧:


  • \s+匹配任意多个空白字符(空格、换行等),替换成一个空格,解决排版混乱问题。
  • [^\u4e00-\u9fa5...]表示 “不包含这些字符”,用它来过滤不需要的符号,\u4e00-\u9fa5是中文范围。



实战案例三:解析日志文件,提取错误信息


日志文件里藏着很多关键信息,用正则能快速定位错误。

场景:


一段日志文本:
plaintext
2023-10-01 08:30:00 INFO 系统启动成功2023-10-01 08:35:20 ERROR 数据库连接失败:无法连接到服务器2023-10-01 08:40:10 INFO 用户登录:user12023-10-01 08:45:30 ERROR 数据查询失败:SQL语法错误

需要提取所有错误日志(包含 ERROR 的行)。

步骤:


  1. 写规则:匹配包含 “ERROR” 的行,规则r".*ERROR.*"
    • .*匹配任意字符(除换行)任意次,所以.*ERROR.*表示包含 ERROR 的整行文本。

  2. 按行提取

python
import relog_text = """2023-10-01 08:30:00 INFO 系统启动成功2023-10-01 08:35:20 ERROR 数据库连接失败:无法连接到服务器2023-10-01 08:40:10 INFO 用户登录:user12023-10-01 08:45:30 ERROR 数据查询失败:SQL语法错误"""error_pattern = r".*ERROR.*"# 按行分割文本,再逐个匹配lines = log_text.split("\n")errors = [line for line in lines if re.match(error_pattern, line)]print(errors)# 输出:['2023-10-01 08:35:20 ERROR 数据库连接失败:无法连接到服务器', '2023-10-01 08:45:30 ERROR 数据查询失败:SQL语法错误']

进阶用法:


如果想提取错误原因(冒号后面的内容),可以用分组(),规则写成r"ERROR (.*?)$",用re.findall提取分组内容:
python
error_reason_pattern = r"ERROR (.*?)$"reasons = re.findall(error_reason_pattern, log_text)print(reasons)  # 输出:['数据库连接失败:无法连接到服务器', '数据查询失败:SQL语法错误']

自问自答:新手学 Python 正则常见问题


问:正则规则记不住怎么办?


答:不用死记!把常用规则(手机号、邮箱、日期)存成模板,需要时改改就行。比如邮箱规则r"[a-zA-Z0-9_\.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9\.-]+",存到记事本里,要用时复制过来。

问:在线工具有用吗?


答:超有用!新手一定要用在线正则测试工具(比如菜鸟工具正则测试),左边输规则,右边输文本,实时看匹配结果,报错了还会标红提示,比直接在 Python 里调试快多了。

问:为什么我的规则在 Python 里不生效,在线工具里却好用?


答:可能是没加r前缀!Python 里\是转义符,比如\d在字符串里会被解析成特殊字符,加r变成原始字符串r"\d",才能被正则正确识别,这个坑新手经常踩。

个人心得:多练实战案例,比背语法有用 10 倍


兔子哥刚开始学正则时,也对着规则表背了半天,结果一到实战还是懵。后来发现,不如直接拿真实数据练:爬点网页文本提取信息,找段杂乱数据清洗,或者解析日志文件,练着练着就懂了。
其实正则没那么难,核心就是 “明确你要匹配什么”—— 先想清楚目标文本的规律(比如手机号是 11 位数字,开头 13-19),再用对应的符号描述规律(1[3-9]\d{9}),最后用re模块函数提取或替换。
新手别害怕写错规则,正则就是在不断试错中学会的。比如提取手机号时,先写简单规则r"1\d{10}",发现匹配了 12345678901 这种无效号,再优化成r"1[3-9]\d{9}",这个过程比直接看教程记得牢。
希望这篇教程能帮你入门 Python 正则表达式,现在就找一段文本,试试提取里面的邮箱或日期,动手练起来。记住,正则是工具,用得多了自然就顺手了,加油!

标签: 正则表达式 abc123def456

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~