
图1:Python正则表达式 – 核心语法总览
一、什么是Python正则表达式?
正则表达式(Regular Expression,简称Regex)是一套用特殊字符组成的字符串匹配规则,而Python正则表达式,就是用Python的re模块来实现这套规则,帮我们快速完成文本的匹配、查找、提取、替换等操作。
- 快速查找、提取、替换文本,大幅提升开发效率
- 表单验证:手机号、邮箱、身份证、密码格式校验
- 爬虫数据解析:从网页源码中精准提取目标内容
- 日志清洗:批量处理日志文件,提取关键信息
举个最简单的例子:你有一堆用户手机号,想快速筛选出格式正确的号码,用正则表达式一行规则就能搞定,不用手动逐个检查,这就是正则的强大之处。
二、Python正则表达式:re模块基础使用
Python正则表达式的功能,全部由Python内置的 re模块 提供,无需额外安装,直接导入就能使用,是Python正则表达式的核心载体。
# 导入re模块(Python正则表达式的标准写法,必须先导入) import re # 正则表达式建议统一用 r"" 包裹,r代表原生字符串,避免转义字符出错 # 基本使用流程:re.方法(正则表达式, 待匹配字符串) result = re.match(r"\d+", "123abc") # 匹配字符串开头的数字
新手必记:r”” 的作用
Python中字符串的 \ 有特殊转义含义,比如 \n 代表换行。如果正则里需要匹配 \ 本身,不加 r 就要写 \\,非常麻烦。用 r”” 包裹正则,会让字符串保持原生状态,直接写 \d、\w 即可,避免转义错误,是Python正则表达式的标准写法。

图2:Python正则表达式 – re模块4大核心方法区别对比
三、re模块4大核心方法(新手必掌握)
re模块有4个最常用的核心方法,覆盖了Python正则表达式的绝大多数使用场景,每个方法的适用场景不同,新手一定要分清。
1. match():从字符串开头匹配
match() 会从字符串的第一个字符开始匹配,如果开头不匹配,直接返回None,适合校验字符串开头的格式。
import re # 匹配以数字开头的字符串 res = re.match(r"\d+", "123abc") # 匹配成功,用group()获取匹配到的内容 print(res.group()) # 输出:123 # 开头不是数字,匹配失败,返回None res2 = re.match(r"\d+", "abc123") print(res2) # 输出:None
2. search():查找任意位置的第一个匹配
search() 会扫描整个字符串,找到第一个符合规则的匹配就返回,不管位置在哪里,适合查找字符串中是否存在某个内容。
# 查找字符串中的第一个数字串 res = re.search(r"\d+", "abc123def456") print(res.group()) # 输出:123(只返回第一个匹配)
3. findall():查找所有匹配,返回列表(最常用)
findall() 会扫描整个字符串,找到所有符合规则的匹配,以列表形式返回,是爬虫、数据提取最常用的方法。
# 查找字符串中的所有数字串 res = re.findall(r"\d+", "abc123def456") print(res) # 输出:['123', '456'](返回所有匹配的列表)
4. sub():替换匹配到的内容
sub() 会把字符串中所有符合规则的匹配,替换成指定内容,适合批量文本清洗、替换。
# 把字符串中的所有数字替换成 * res = re.sub(r"\d+", "*", "abc123def456") print(res) # 输出:abc*def*
四、正则基础语法(必背,Python正则表达式核心)
正则的核心是语法规则,下面给大家整理了Python正则表达式最常用的基础语法,新手一定要记牢,覆盖90%的日常使用场景。
1. 字符匹配类
- .:匹配任意1个字符(除了换行符 \n)
- \d:匹配数字 0-9,等价于 [0-9]
- \D:匹配非数字,和 \d 相反
- \w:匹配字母、数字、下划线(a-z/A-Z/0-9/_)
- \W:匹配非字母数字下划线,和 \w 相反
- \s:匹配空白字符(空格、制表符 \t、换行 \n 等)
- \S:匹配非空白字符,和 \s 相反
- []:匹配括号内的任意1个字符,比如 [a-z] 匹配小写字母
2. 数量匹配类
- *:匹配前面的字符 0 次或多次(尽可能多匹配)
- +:匹配前面的字符 1 次或多次(至少1次)
- ?:匹配前面的字符 0 次或 1 次(最多1次)
- {n}:匹配前面的字符 恰好 n 次
- {n,}:匹配前面的字符 至少 n 次
- {n,m}:匹配前面的字符 n~m 次(包含n和m)
3. 边界与分组类
- ^:匹配字符串的开头(和 [] 内的 ^ 含义不同,[] 内代表取反)
- $:匹配字符串的结尾
- ():分组,把括号内的内容作为一个整体,用于精准提取数据
- |:或,匹配左右两边任意一个规则,比如 a|b 匹配a或b
五、分组提取():Python正则表达式最实用的功能
在Python正则表达式中,用 () 把需要提取的内容包起来,就能精准获取目标数据,是爬虫、数据提取的核心技巧。分组后,用 group() 方法按顺序获取提取的内容:
- group(0):获取整个匹配到的字符串(默认)
- group(1):获取第一个分组的内容
- group(2):获取第二个分组的内容,以此类推
# 示例:从文本中提取姓名和年龄 text = "姓名:小明,年龄:18,职业:学生" # 用()包裹需要提取的内容:(\w+) 匹配姓名,(\d+) 匹配年龄 res = re.search(r"姓名:(\w+),年龄:(\d+)", text) # 提取分组内容 print(res.group(1)) # 输出:小明(第一个分组) print(res.group(2)) # 输出:18(第二个分组) print(res.group(0)) # 输出:姓名:小明,年龄:18(整个匹配)
六、经典实战案例(直接套用,小白友好)
下面给大家整理了Python正则表达式最常用的4个实战案例,每个案例都加了详细注释,新手可以直接复制使用,也可以根据需求修改。
案例1:手机号格式验证
国内手机号规则:1开头,第二位3-9,后面9位数字,共11位。
import re
def check_phone(phone):
"""
验证手机号格式是否正确
:param phone: 待验证的手机号字符串
:return: 格式正确返回True,错误返回False
"""
# ^ 匹配开头,$ 匹配结尾,确保整个字符串都是手机号
# 1[3-9] 匹配1开头,第二位3-9,\d{9} 匹配后面9位数字
pattern = r"^1[3-9]\d{9}$"
# 用match匹配,成功则返回非None,否则返回None
return re.match(pattern, phone) is not None
# 测试
print(check_phone("13812345678")) # 输出:True(格式正确)
print(check_phone("123456")) # 输出:False(位数不足)
print(check_phone("23812345678")) # 输出:False(开头不是1)
案例2:邮箱格式验证
通用邮箱规则:用户名@域名.后缀,用户名支持字母、数字、下划线。
def check_email(email):
"""
验证邮箱格式是否正确
:param email: 待验证的邮箱字符串
:return: 格式正确返回True,错误返回False
"""
# ^\w+ 匹配开头的用户名(字母、数字、下划线)
# @ 匹配@符号
# \w+ 匹配域名
# \.\w+ 匹配后缀(.com、.cn等)
# $ 匹配结尾
pattern = r"^\w+@\w+\.\w+$"
return re.match(pattern, email) is not None
# 测试
print(check_email("test@example.com")) # 输出:True
print(check_email("test_example.com")) # 输出:False(缺少@)
案例3:从网页中提取所有链接
爬虫常用,从HTML源码中提取所有a标签的href链接。
# 网页HTML源码示例 html = '百度知乎' # 正则规则:href="(https?://.*?)" # https? 匹配http或https,:// 匹配固定部分,.*? 非贪婪匹配链接内容 # 用()包裹链接,提取分组内容 res = re.findall(r'href="(https?://.*?)"', html) print(res) # 输出:['https://www.baidu.com', 'https://www.zhihu.com']
案例4:去除文本中的所有特殊符号
保留中文、字母、数字,去除所有特殊符号、标点。
text = "abc!@#123&*()小明,你好!" # 正则规则:[^\w\u4e00-\u9fa5] # ^ 代表取反,\w 匹配字母数字下划线,\u4e00-\u9fa5 匹配所有中文字符 # 所以这个规则匹配所有非字母、非数字、非中文的字符 # 用sub把这些字符替换成空字符串,就完成了特殊符号的去除 res = re.sub(r"[^\w\u4e00-\u9fa5]", "", text) print(res) # 输出:abc123小明你好

图3:Python正则表达式 – 贪婪vs非贪婪匹配执行流程
七、贪婪匹配 vs 非贪婪匹配(Python正则避坑核心)
Python正则表达式默认是贪婪匹配:尽可能多的匹配字符;在数量符(*、+、?、{n,m})后面加 ?,就会变成非贪婪匹配:尽可能少的匹配字符,是爬虫、数据提取最容易踩的坑。
import re # 示例文本:两个div标签,需要分别提取每个div内的内容 text = "helloworld" # 1. 贪婪匹配(默认):.* 尽可能多匹配 # 结果:把两个div整个匹配了,只返回一个结果 res1 = re.findall(r".*", text) print("贪婪匹配结果:", res1) # 输出:['helloworld'] # 2. 非贪婪匹配:.*? 尽可能少匹配 # 结果:分别匹配每个div,返回两个结果,符合预期 res2 = re.findall(r".*?", text) print("非贪婪匹配结果:", res2) # 输出:['hello', 'world']
总结:提取多个短内容时,一定要用 .*? 非贪婪匹配,避免贪婪匹配把多个内容当成一个匹配,导致提取结果错误。
八、高频易错点(避坑指南,新手必看)
整理了Python正则表达式开发中,新手最容易踩的4个坑,每个坑都标了原因和解决方法,看完这些,再也不会因为这些问题报错。
坑1:忘记加 r””,导致转义字符出错
Python中 \ 有特殊转义含义,不加 r 会导致正则中的 \d、\w 被转义,匹配失败。解决方法:所有正则统一用 r”” 包裹,原生字符串避免转义。
坑2:用match()匹配中间内容,匹配不到
match() 只从字符串开头匹配,中间内容匹配不到。解决方法:查找任意位置用 search() 或 findall(),不要用match()。
坑3:贪婪匹配导致提取结果不符合预期
默认贪婪匹配会尽可能多匹配,导致提取多个内容时只返回一个结果。解决方法:提取短内容用 .*? 非贪婪匹配。
坑4:表单验证忘记加 ^ 和 $,导致格式校验失效
不加 ^ 和 $,会匹配字符串中符合规则的部分,比如手机号验证时,”13812345678abc” 也会被判定为正确。解决方法:表单验证必须加 ^ 开头和 $ 结尾,确保整个字符串符合规则。
Python正则表达式 延伸学习推荐
深入学习可参考Python官方re模块文档;
学完正则表达式,可回顾Python模块与包、Python文件操作与异常处理,实现正则+模块化结合的工程化开发。
九、核心知识点总结(快速复习)
- re模块4大核心方法:match(开头匹配)、search(任意位置第一个)、findall(所有匹配,最常用)、sub(替换)
- r”” 原生字符串:避免转义错误,Python正则表达式的标准写法
- () 分组提取:精准提取目标数据,爬虫、数据提取的核心技巧
- .*? 非贪婪匹配:提取多个短内容必备,避免贪婪匹配导致结果错误
- ^ 和 $ 边界符:表单验证必须加,确保整个字符串符合格式
- Python正则表达式是文本处理神器,熟练使用可大幅提升开发效率,是Python工程师的必备技能
版权声明:本文所有内容(含代码、图片、文字)均为原创,未经授权禁止任何形式的转载、抄袭、洗稿
如需转载,请联系作者获得授权,并在正文开头显著位置标注原文链接和作者信息!
下一篇:Python 多线程与多进程,让程序飞起来!
Python正则表达式
Python re模块
Python正则语法
Python文本处理
Python爬虫数据提取
Python入门

渝公网安备50022402001073号
Pingback: 零基础学 Python 核心编程:7 大核心主题 + 实战进阶全攻略 - 小白 编程 笔记
Pingback: Python核心编程:7大核心主题+实战进阶全攻略,小白一站式学Python - 小白 编程 笔记