Python正则表达式入门:从零基础到高效文本处理
简介:这份PDF资料面向正在学习Python的开发者,聚焦正则表达式这一核心技能点,适合已掌握Python基础语法、希望系统梳理或查漏补缺的初中级学习者。内容围绕正则表达式的语法规则、常用元字符、匹配模式与典型应用场景展开,可帮助读者解决文本提取、格式校验、字符串替换等实际编程问题。资源包内共1个PDF文件,压缩包大小约661KB,体积轻便,便于在电脑或移动设备上随时查阅,适合作为日常学习与查阅的参考材料。目前已有260人学习下载,具备一定的参考热度。通过这份资料,读者可以系统理解正则表达式的匹配逻辑,掌握常用写法的组合技巧,并借助示例加深对分组、量词、边界匹配等知识点的印象,为后续处理日志解析、数据清洗、爬虫内容提取等任务打下基础,适合作为Python学习路线中正则专题的配套阅读材料。
1. 零基础也能懂:正则表达式到底是个什么东西
你有没有遇到过这种情况:手头有一堆文本,想从里面找出所有手机号、所有邮箱、或者把所有“日期”格式统一改一遍,结果只能一行一行肉眼扫,复制粘贴到手酸。更崩溃的是,数据有几千行,眼睛看花了还漏掉几个。这时候,懂行的人会告诉你:用正则表达式啊,一行代码就搞定。
别被“正则表达式”这四个字吓到。你可以把它理解成一种专门用来描述文本规律的迷你语言。比如你想找“三个数字后面跟一个横杠,再跟四个数字”,用正则写出来就是\d{3}-\d{4}。它不关心具体是 123-4567 还是 888-9999,只要符合这个“形状”,它就能一把抓出来。Python 里的re模块就是干这个的,它是 Python 自带的标准库,不用额外安装,打开编辑器就能用。
这份资源是一篇 CSDN 会员文章,主题就是Python 学习之正则表达式。它适合谁?适合刚学完 Python 基础语法、能写几行for循环和if判断,但一碰到文本处理就头大的新手。你不需要有算法基础,也不需要数学多好,只要会敲键盘、能看懂简单的英文单词,就能跟着上手。学完它,你至少能自己写出匹配手机号、邮箱、提取网页里特定内容的代码,不用再求人。
2. 为什么值得学:正则能帮你省下多少时间
2.1 从“手动整理”到“一行提取”的差距
假设你是一个运营或者学生,老师发给你一个文本文件,里面混着几百条学生信息,格式大概是“姓名:张三,电话:13812345678,邮箱:zhangsan@example.com”。现在你要把所有人的手机号单独列出来。手动做,你得一行一行找,复制、粘贴,半小时可能才搞完一百条,还容易看串行。
用正则,代码大概长这样:
import re text = "姓名:张三,电话:13812345678,邮箱:zhangsan@example.com" # 匹配 1 开头的 11 位数字 phones = re.findall(r'1\d{10}', text) print(phones) # 输出 ['13812345678']re.findall的意思是“找出所有符合规律的片段”。r'1\d{10}'里的1表示手机号第一位必须是 1,\d代表任意数字,{10}表示后面再跟 10 个数字。合起来就是“1 开头,总共 11 位数字”。你不需要告诉它具体是 138 还是 159,它自己会判断。
这就是正则的核心价值:你描述规律,它负责匹配。规律写一次,以后不管来多少数据,都能秒出结果。对于经常要处理日志、爬虫数据、表单内容的人来说,这是实打实的效率工具。
2.2 新手学正则,先抓三个最常用的功能
很多新手一打开正则教程,看到一堆^ $ . * + ? {} [] () |就晕了。其实入门阶段,你只需要先掌握三个功能,就能解决 80% 的日常问题。
第一个是查找:用re.findall()找出所有符合规律的字符串。比如从一篇文章里找出所有年份\d{4}年。
第二个是替换:用re.sub()把符合规律的内容换成别的。比如把日期2024-01-01统一改成2024年01月01日。
第三个是判断:用re.match()或re.search()检查一段文本里有没有你要的东西。比如验证用户输入的手机号格式对不对。
这三个功能对应三个函数,你先把它们用熟,再去学分组、贪婪匹配这些进阶概念,就不会觉得无从下手。我第一次学的时候,就是先拿findall把自己博客里所有链接抠出来,跑通那一刻才觉得“这东西真有用”。
提示:入门阶段不要死记所有元字符,先记住
\d(数字)、\w(字母数字下划线)、.(任意字符)、*(0 次或多次)、+(1 次或多次)这五个,足够你写出很多实用规则。
3. 第一步怎么迈:从安装到跑通第一个例子
3.1 环境准备:你只需要一个能跑 Python 的地方
正则表达式是 Python 内置模块,不需要pip install任何东西。你只要电脑上装了 Python,打开 IDLE、VS Code、PyCharm 或者 Jupyter Notebook 都能直接写。如果你还没装 Python,去官网下载最新版,安装时勾选“Add Python to PATH”,一路下一步就行。
验证环境是否就绪,在命令行输入:
python --version看到类似Python 3.11.5的输出,就说明没问题。然后新建一个.py文件,或者直接在交互式窗口里敲代码,就可以开始了。
3.2 第一个完整例子:从文本里提取所有邮箱
我们拿一段模拟文本练手,里面混着几个邮箱地址:
import re text = """ 联系人:A同学,邮箱:a_student@example.com 联系人:B同学,邮箱:b.student@test.org 联系人:C同学,邮箱:c123@demo.net """ # 邮箱规律:若干字母数字点,@,若干字母数字,.,若干字母 pattern = r'[a-zA-Z0-9._]+@[a-zA-Z0-9]+\.[a-zA-Z]+' emails = re.findall(pattern, text) for email in emails: print(email)运行结果会依次打印出三个邮箱。我们来拆解pattern里的每一段:
[a-zA-Z0-9._]+:表示邮箱用户名部分,允许大小写字母、数字、点、下划线,+表示至少出现一次。@:就是邮箱里的 @ 符号,原样匹配。[a-zA-Z0-9]+:域名主体,比如example、test,只允许字母和数字。\.:转义后的点,因为点在正则里是特殊字符,要匹配真正的点必须加反斜杠。[a-zA-Z]+:域名后缀,比如com、org、net。
这段代码你直接复制到 Python 文件里就能跑。如果报错,先检查引号是不是中文引号,再检查re有没有导入。跑通之后,你可以把text换成任意一段文字,看看能不能抓出邮箱。这就是你迈出的第一步。
3.3 把例子改一改,立刻变成你自己的工具
跑通第一个例子后,别停。试着改两个地方:第一,把text换成你复制的一段真实文本(比如某篇文章的评论区);第二,把pattern改成匹配手机号的r'1\d{10}'。你会发现,同样的代码结构,换个规律就能干不同的事。
再进一步,你可以把提取结果写进文件:
with open('result.txt', 'w', encoding='utf-8') as f: for email in emails: f.write(email + '\n')这样你就完成了一个“文本提取小工具”。虽然简单,但已经能解决实际问题。入门阶段,成就感比什么都重要。
4. 避坑指南:新手最容易翻车的五个地方
4.1 现象:代码报错re.error: bad escape
原因:在正则字符串里用了反斜杠但没写对,比如想匹配点却只写了.,或者转义字符不完整。
解决:匹配特殊字符时记得加\,比如\.匹配点,\*匹配星号。更省事的办法是直接用原始字符串r'...',这样反斜杠不会被 Python 提前处理。
4.2 现象:findall返回空列表,明明文本里有
原因:正则写得太严,比如多了一个空格,或者大小写没对上。
解决:先用re.search(pattern, text)看能不能找到第一个,再逐步放宽条件。也可以把pattern打印出来,对着文本一个字符一个字符核对。
4.3 现象:匹配结果多出一大段,把不该要的也抓进来了
原因:用了贪婪匹配,比如.*会尽可能往多了匹配。
解决:在量词后面加?变成非贪婪,比如.*?。或者把.换成更具体的字符集,比如[^,]+表示“除了逗号什么都行”。
4.4 现象:中文匹配不到,或者乱码
原因:Python 3 默认字符串是 Unicode,但如果你从文件读文本时没指定编码,可能读进来就是乱码。
解决:打开文件时加encoding='utf-8'。匹配中文可以用[\u4e00-\u9fa5]表示常用汉字范围。
4.5 现象:re.match和re.search分不清,结果不对
原因:match只从字符串开头匹配,search会扫描整个字符串。
解决:想找“包含”就用search,想验证“开头就是”才用match。大多数提取场景用findall或search就够了。
5. 下一步学什么:从会用到用好的一条路径
恭喜你,能读到这儿,说明你已经跑通了第一个例子,也知道了常见的坑。接下来怎么继续?我给你一条我当初自己走过的路线,不绕弯。
第一阶段:把re模块的四个核心函数用熟。findall、sub、search、split,这四个覆盖了查找、替换、判断、分割。你可以在网上找一段新闻文本,试着用它们完成:提取所有日期、把所有“先生”换成“女士”、判断有没有“紧急”这个词、按句号分割成句子。每个练十遍,手就熟了。
第二阶段:掌握分组和命名分组。
比如从2024-01-01里分别提取年、月、日,可以用(\d{4})-(\d{2})-(\d{2}),然后用group(1)、group(2)取出来。命名分组(?P<year>\d{4})能让代码更好读。这个阶段你可以试着写一个解析日志的脚本,把时间、级别、消息分开。
第三阶段:了解贪婪与非贪婪、断言、编译标志。
这些是进阶技巧,但不需要一次学完。遇到问题再查,比如re.IGNORECASE可以让匹配忽略大小写,re.DOTALL让点号匹配换行。我建议你建一个自己的“正则速查表”,每学一个就记一个例子,用的时候直接翻。
第四阶段:结合真实场景做小项目。
比如写一个批量重命名文件的脚本,用正则匹配文件名里的序号;或者写一个简单的表单验证器,检查邮箱、手机号、身份证号格式。项目不用大,能跑通、能解决你自己的问题就行。
最后说个我自己的血泪经验:每次写正则,先拿一小段测试文本跑通,再放到大文本上。我以前偷懒,直接对几千行日志写规则,结果匹配错了,排查半天。从那以后我每次写正则都强制走一遍“小文本验证 → 逐步放宽 → 再上全量”的流程。希望这个习惯也能帮到你。
本文还有配套的精品资源,点击获取