Python 正则表达式入门:从匹配手机号到提取文本内容
一、前言:为什么要学正则表达式?
在日常Python开发、数据处理、爬虫工作中,我们经常会遇到这些高频需求:
从杂乱文本中精准提取手机号、邮箱、身份证
批量替换文本中的数字、特殊符号、敏感词
按照多种不规则分隔符拆分字符串
校验用户输入的账号、密码、网址格式是否合法
提取简单HTML、文本标签中的核心内容
普通字符串方法只能处理规则固定的简单场景,而正则表达式可以通过一套通用规则,适配所有复杂文本处理场景,是Python文本处理的必备核心技能。
Python 内置re 模块,无需额外安装,开箱即用,本文从零带你吃透正则基础,手把手实现实战案例。
二、环境准备:导入re模块
Python 正则操作全部依赖内置re模块,使用前只需导入即可:
importrere是 regular expression 的缩写,核心作用:自定义字符规则,实现字符串的匹配、查找、替换、分割。
三、五大核心方法实战(零基础必掌握)
3.1 re.search():查找第一个匹配项
作用:扫描整个字符串,返回第一个匹配成功的结果,匹配失败返回None。
核心注意:必须判断结果非空后,再调用.group()获取匹配内容,避免报错。
案例1:文本中提取手机号
importre text="我的手机号是 13812345678,邮箱是 test@example.com"# 手机号正则:1开头,第二位3-9,后接9位数字phone=re.search(r"1[3-9]\d{9}",text)ifphone:print(f"找到手机号:{phone.group()}")# 输出:找到手机号:13812345678正则规则解析
1:手机号固定以1开头[3-9]:第二位数字范围3-9(符合国内手机号规则)\d{9}:匹配9位数字(剩余手机号位数)
案例2:文本中提取邮箱
importre text="我的手机号是 13812345678,邮箱是 test@example.com"email=re.search(r"\w+@\w+\.\w+",text)ifemail:print(f"找到邮箱:{email.group()}")# 输出:找到邮箱:test@example.com邮箱正则规则解析
\w+:匹配1个及以上字母、数字、下划线(邮箱用户名)@:精准匹配邮箱固定符号\w+:匹配域名主体\.:转义匹配点号(正则中.是任意字符,必须转义才是普通点)\w+:匹配邮箱后缀(com、cn、net等)
3.2 re.findall():查找所有匹配项(批量提取)
作用:查找字符串中所有匹配内容,以列表形式返回,无匹配则返回空列表,是批量提取文本的高频方法。
案例:批量提取文本中所有数字价格
importre text="商品价格:100元、200元、350元、89.9元"# \d+ 匹配连续数字prices=re.findall(r"\d+",text)print(prices)# 输出:['100', '200', '350', '89', '9']适合场景:批量提取数字、关键词、特殊格式文本,比循环匹配效率高10倍以上。
3.3 re.sub():正则替换字符串
作用:根据正则规则匹配内容,批量替换为指定字符,完美解决普通replace无法处理的模糊替换场景。
语法:re.sub(pattern, replacement, string)
pattern:正则匹配规则
replacement:替换后的内容
string:需要处理的原字符串
案例:批量隐藏日期数字
importre text="今天是2026年02月19日,订单编号20260219001"# 所有连续数字替换为Xresult=re.sub(r"\d+","X",text)print(result)# 输出:今天是X年X月X日,订单编号X3.4 re.split():多分隔符拆分字符串
痛点:Python原生split()仅支持单一分隔符,无法处理不规则分隔的文本。
解决方案:re.split()支持多分隔符、不规则空白拆分。
案例:拆分含分号、逗号、空格的文本
importre text="张三;李四,王五 赵六 钱七;孙八"# 匹配分号、逗号、空白字符,多个分隔符合并拆分names=re.split(r"[;,\s]+",text)print(names)# 输出:['张三', '李四', '王五', '赵六', '钱七', '孙八']规则解析:[;,\s]+
[]:字符集合,匹配集合内任意一个字符; , \s:分别匹配分号、逗号、空白字符(空格、换行、制表符)+:匹配1个及以上连续字符,避免拆分空值
3.5 re.match():精准校验文本格式
作用:从字符串开头严格匹配,适合做格式校验(手机号、邮箱、账号),必须整串符合规则才会匹配成功。
核心搭配:^(开头)+$(结尾)实现全局精准校验。
案例1:完整手机号格式校验
importre# 全局手机号校验规则phone_pattern=r"^1[3-9]\d{9}$"print(re.match(phone_pattern,"13812345678"))# 匹配成功print(re.match(phone_pattern,"138123456"))# 位数不足,匹配失败print(re.match(phone_pattern,"23812345678"))# 开头错误,匹配失败案例2:通用邮箱格式校验
importre# 适配绝大多数常规邮箱格式email_pattern=r"^[\w.+-]+@[\w-]+\.[\w.]+$"print(re.match(email_pattern,"test@example.com"))# 合法print(re.match(email_pattern,"test123@qq.com"))# 合法print(re.match(email_pattern,"test.com"))# 非法提示:业务简单格式校验可使用该正则,正式生产邮件校验需结合发送验证。
四、进阶实战:提取HTML标签内容
利用正则分组+非贪婪匹配,可快速提取简单HTML标签文本,适合轻量文本解析。
importre html="<h1>Python正则入门教程</h1><p>零基础快速掌握正则用法</p>"# 分组匹配标签内容,? 开启非贪婪匹配contents=re.findall(r"<\w+>(.*?)</\w+>",html)print(contents)# 输出:['Python正则入门教程', '零基础快速掌握正则用法']核心规则解析
<\w+>:匹配任意HTML开始标签(.*?):分组+非贪婪匹配,精准提取标签内文本(核心!避免多标签串匹配)</\w+>:匹配任意HTML结束标签
重要提醒:正则仅适合简单静态HTML片段,复杂爬虫解析请使用 BeautifulSoup、lxml 专业库。
五、正则基础符号速查表(收藏必备)
| 正则符号 | 详细含义 |
|---|---|
. | 匹配任意单个字符(换行符除外) |
\d | 匹配任意数字,等价于 [0-9] |
\D | 匹配任意非数字字符 |
\w | 匹配字母、数字、下划线 |
\W | 匹配非字母、非数字、非下划线 |
\s | 匹配空白字符(空格、换行、制表符) |
\S | 匹配非空白字符 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
* | 匹配前面字符 0次或多次 |
+ | 匹配前面字符 1次或多次 |
? | 匹配前面字符 0次或1次,开启非贪婪匹配 |
{n} | 精准匹配前面字符 n 次 |
{n,m} | 匹配前面字符 n~m 次 |
[] | 字符集合,匹配集合内任意单个字符 |
() | 分组匹配,精准提取分组内内容 |
六、五大核心方法选型指南
新手不用死记硬背,根据需求直接选:
| 方法 | 适用场景 |
|---|---|
re.search() | 查找第一个匹配内容 |
re.match() | 字符串整体格式校验(从头匹配) |
re.findall() | 批量查找所有匹配内容(最常用) |
re.sub() | 批量替换文本内容 |
re.split() | 多分隔符、不规则文本拆分 |
七、新手必看:为什么正则前要加 r?
大家会发现所有案例中,正则表达式都写为r"\d+"原始字符串格式。
核心作用:r代表原生字符串,屏蔽Python转义机制,避免正则符号双重转义报错。
如果不添加r,复杂正则中的\d、\s容易被Python解析为转义字符,导致正则规则失效。
编码好习惯:所有Python正则表达式,统一使用r"正则规则"格式!
八、全文总结
本文从零入门Python正则表达式,覆盖开发90%基础场景,核心知识点复盘:
掌握search/findall/sub/split/match五大核心方法,适配查找、替换、拆分、校验全场景
熟记\d、\w、\s、+、*、?、^、$基础符号,可完成绝大多数文本匹配
手机号、邮箱、HTML内容提取为通用实战模板,可直接复用
正则优先使用
r""原始字符串,规避转义问题简单文本解析用正则,复杂网页解析用专业爬虫库
正则看似是符号密码,实则规则固定,熟练后可以极大提升文本处理效率,是Python数据分析、爬虫、自动化开发的必备技能!