Python正则表达式全解:9 大核心知识点 + 实战案例,文本处理神器 – 小白编程笔记

Python正则表达式是处理文本、字符串的神器,不管是表单验证、爬虫数据提取、日志清洗,还是批量文本替换,它都能帮你高效搞定。很多新手觉得正则语法复杂难记,这篇文章我会用最通俗的话,从零讲透Python正则表达式的全套语法、re模块用法、经典实战案例,零基础也能快速上手,练完就能写出专业的文本处理代码。

Python正则表达式 核心语法总览图 字符/数量/边界/分组

图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正则表达式的标准写法。

Python正则表达式 re模块4大核心方法对比图 match/search/findall/sub

图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小明你好

Python正则表达式 贪婪vs非贪婪匹配流程示意图 .* vs .*?

图3:Python正则表达式 – 贪婪vs非贪婪匹配执行流程

七、贪婪匹配 vs 非贪婪匹配(Python正则避坑核心)

Python正则表达式默认是贪婪匹配:尽可能多的匹配字符;在数量符(*、+、?、{n,m})后面加 ?,就会变成非贪婪匹配:尽可能少的匹配字符,是爬虫、数据提取最容易踩的坑。

import re

# 示例文本:两个div标签,需要分别提取每个div内的内容
text = "
hello
world
" # 1. 贪婪匹配(默认):.* 尽可能多匹配 # 结果:把两个div整个匹配了,只返回一个结果 res1 = re.findall(r"
.*
", text) print("贪婪匹配结果:", res1) # 输出:['
hello
world
'] # 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正则表达式
Python re模块
Python正则语法
Python文本处理
Python爬虫数据提取
Python入门

2人评论了“Python正则表达式全解:9 大核心知识点 + 实战案例,文本处理神器 – 小白编程笔记”

  1. Pingback: 零基础学 Python 核心编程:7 大核心主题 + 实战进阶全攻略 - 小白 编程 笔记

  2. Pingback: Python核心编程:7大核心主题+实战进阶全攻略,小白一站式学Python - 小白 编程 笔记

发表评论

滚动至顶部
渝公网安备50022402001073号  |  渝ICP备2026004448号   © 2026 小白编程笔记