跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 正则表达式核心用法解析

Python 正则表达式通过 re 模块实现字符串匹配。主要方法包括 match(从头匹配)、search(任意位置匹配)、findall(获取所有匹配)。字符匹配涵盖 .、\d、\w 等,量词包括 *、+、{m,n} 及贪婪非贪婪模式。锚点 ^ 和 $ 用于指定起止位置,分组 () 提取子串。其他功能支持 compile 对象化、sub 替换、split 拆分及单词边界 \b 处理。掌握这些基础可高效处理文本数据清洗与爬虫任务。

芝士奶盖发布于 2026/3/15更新于 2026/9/968 浏览
Python 正则表达式核心用法解析

1. 正则和 re 模块的联系

正则表达式是一种通用的用来简洁表达一组字符串的表达式,利用正则表达式可以方便快捷地匹配和筛选字符串。

举个例子:在一堆数据中寻找电话号码,我们需要根据特征进行查找。电话是 11 位数字,基于特征寻找。

正则的一些方法都放在 re 模块中。re 模块使 Python 语言拥有全部的正则表达式功能,提供了与这些方法功能完全一致的函数,使用一个模式字符串作为第一个参数。

import re

正则在爬虫中很常见,在大量字符串中进行数据寻找。

例如匹配 11 位数字:\d{11}。

匹配手机号(第一位 1,第二位 3-9,后面 9 位数字):1[3-9]\d{9}。

2. re 模块的一些方法

re.match--从字符串开头进行匹配---匹配一次

re.match() 必须从字符串开头匹配。如果不是起始位置匹配成功,返回 None。

只会匹配一次数据。如果匹配失败返回 None,成功返回匹配的范围区间。

import re
r = re.match('test', 'testabcdfgsdtest')
print(r)  # <re.Match object; span=(0, 4), match='test'>
r = re.match('test', 'Testabcdfgsdtest')
print(r)  # None

获取匹配内容:

import re
r = re.match('test', 'testabcdfgsdtest')
print(r.group())  # test

获取匹配位置:

import re
r = re.match('test', 'testabcdfgsdtest')
print(r.span())  # (0, 4)

这里的 (0, 4) 是左闭右开区间。

re.search---在字符串任意位置都能进行查找---匹配一次

re.search() 方法只在目标字符串中匹配一次满足条件的正则表达式,返回查找字符的位置。

不管在哪个位置都可以进行目标寻找,只匹配第一次满足条件的一串字符。

import re
r = re.search('test', 'tdestabcdfgsdtest')
(r)
(r.group())
(r.span())

print
print
print
# <re.Match object; span=(13, 17), match='test'>

re.findall--找到字符串中所有匹配的内容---匹配多次

从字符串中匹配内容,进行多次匹配,有多少次满足项就匹配多少个。

返回结果以列表形式存储。

import re
r = re.findall('test', 'tdestabtestcdfgsdtest')
print(r)  # ['test', 'test']

3. 匹配单个字符

. 的匹配操作

. 匹配任意字符,除了 。

import re
print(re.findall('.', 'test\tand\n'))  # ['t', 'e', 's', 't', '\t', 'a', 'n', 'd']

可以将整个字符串拆分,将每个元素放到列表中。

r = re.match('aaa.', 'aaa1212bbb')
print(r.group())  # aaa1

\d 的匹配操作

将字符串中的数字提取出来。

import re
print(re.findall('\d', 'abd6c123'))  # ['6', '1', '2', '3']

\D 的匹配操作

将字符串中的非数字匹配提取出来。

import re
print(re.findall('\D', 'abd6c123'))  # ['a', 'b', 'd', 'c']

\s 的匹配操作

匹配空白字符。

import re
print(re.findall('\s', 'ted \t anfdsa sd '))  # [' ', '\t', ' ', ' ', ' ']

\S 的匹配操作

匹配非空白字符。

import re
print(re.findall('\S', 'ted \t anfdsa sd '))  # ['t', 'e', 'd', 'a', 'n', 'f', 'd', 's', 'a', 's', 'd']

\w 的匹配操作

匹配单词字符,如字母、数字、下划线、汉字。

import re
print(re.findall('\w', 'hi,小明!'))  # ['h', 'i', '小', '明']

\W 的匹配操作

作用与 \w 相反。

import re
print(re.findall('\W', 'hi,小明!'))  # [',', '!']

[] 匹配列举的任意字符

只会匹配括号内列举出来的,一次匹配一个。

import re
print(re.findall('[a-z]', 'hi,小明!123'))  # ['h', 'i']
print(re.findall('[a-zA-Z]', 'hi,小明 DFS!123'))  # ['h', 'i', 'D', 'F', 'S']
print(re.findall('[0-9]', 'hi,小明 DFS!123'))  # ['1', '2', '3']
print(re.findall('[0-35-9]', 'hi,小明 DFS!124653'))  # ['1', '2', '6', '5', '3']

4. 匹配多个字符

匹配多个字符是基于单个字符的。

* 的匹配使用

允许匹配 0 次,返回空白字符。

import re
print(re.findall('\S*', 'hi,my name is xiaoming'))  # ['hi,my', '', 'name', '', 'is', '', 'xiaoming', '']

+ 的匹配使用

至少匹配 1 次,不会算上空格的。

import re
print(re.findall('\S+', 'hi,my name is xiaoming'))  # ['hi,my', 'name', 'is', 'xiaoming']

设置匹配的长度---{m}

长度至少是 m 才能进行匹配。

import re
print(re.findall('\d{3}', '1233456'))  # ['123', '345']

至少匹配次数---{m,}

import re
print(re.findall('\S{4,}', 'hi,my name is xiaoming'))  # ['hi,my', 'name', 'xiaoming']

匹配{m,n}次

至少匹配 m 次,最多匹配 n 次。

import re
print(re.findall('\S{2,4}', 'hi,my name is xiaoming'))  # ['hi,m', 'name', 'is', 'xiao', 'ming']

5. 贪婪和非贪婪

贪婪:满足匹配的情况下,尽可能匹配多的数据。 非贪婪:满足匹配的情况下,尽可能匹配少的数据。 默认是贪婪模式。

修改为非贪婪模式:在匹配多个的后面加上问号 ?。

import re
print(re.findall('\S{2,4}', 'hi,my name is xiaoming'))  # 贪婪
print(re.findall('\S{2,4}?', 'hi,my name is xiaoming'))  # 非贪婪
r = re.match('aaa.+', 'aaa1212bbb')
print(r.group())  # aaa1212bbb (贪婪)
r = re.match('aaa.+?', 'aaa1212bbb')
print(r.group())  # aaa1 (非贪婪)

6. 匹配开头(^)和匹配结尾($)的设置

^ 可以进行开头字符的设置

import re
print(re.findall('^t\w+', 'testabctest'))  # ['testabctest']
print(re.findall('^t\w+', 'Testabctest'))  # []

$ 设置匹配的结尾字符

import re
print(re.findall('^t\w+t$', 'testabctest'))  # ['testabctest']
print(re.findall('^t\w+T$', 'testabctest'))  # []

7. ^[] 和 [] 的区别

^[ ]: 匹配 [ ] 中列举的字符开头。 [^ ]: 匹配的不是 [ ] 中列举的内容,即取反操作。

import re
print(re.findall('^[Tt]\w+', 'Testabctest'))  # ['Testabctest']
print(re.findall('[^Tt]', 'Testabctest'))  # ['e', 's', 'a', 'b', 'c', 'e', 's']

8. () 分组匹配

import re
r = re.match('<.+>(.*)<.+>', '<h1>python</h1>')
print(r.group())  # <h1>python</h1>
print(r.groups())  # ('python',)

如果 findall 中使用了 (),返回的内容只有 () 中匹配的数据,以列表形式返回。

import re
print(re.findall('<.+>(.*)<.+>', '<h1>python</h1>'))  # ['python']

9. re 模块的其他方法

compile---将正则表达式对象化

compile(正则表达式) 将正则表达式转换为对象,用于多次调用。

import re
c = re.compile('<.+>(.*)<.+>')
print(c.match('<h1>python</h1>').groups())  # ('python',)
print(c.search('<h1>python</h1>').groups())  # ('python',)
print(c.findall('<h1>python</h1>'))  # ['python']

sub()---进行大量数据中数据的替换方法

sub(正则表达式,新数据,修改的字符串,替换次数)。

import re
s1 = 'hello 111word 222'
s2 = re.sub('\d{3}', '666', s1)
print(s2)  # hello 666word 666

split--通过正则进行拆分的操作

split(正则表达式,要拆分的字符串,拆分的次数)。

import re
s = 'huahua1xiaoming2lisi3lala'
l = re.split('\d', s)
print(l)  # ['huahua', 'xiaoming', 'lisi', 'lala']

l = re.split('[1-3]', s)
print(l)  # ['huahua', 'xiaoming', 'lisi', 'lala']

10. 匹配边界--单词边界

\b 匹配单词边界,即前后不能是字母、数字或下划线。

import re
print(re.match('ve\b', 've2test'))  # None
print(re.match(r've\b', 've!2test'))  # <re.Match object; span=(0, 2), match='ve'>
print(re.match('ve\B', 've2test'))  # <re.Match object; span=(0, 2), match='ve'>
print(re.match('ve\B', 've!2test'))  # None

注意:\b 在正则里是边界,在字符串里是退格符,所以建议使用 r'' 原始字符串。

目录

  1. 1. 正则和 re 模块的联系
  2. 2. re 模块的一些方法
  3. re.match--从字符串开头进行匹配---匹配一次
  4. re.search---在字符串任意位置都能进行查找---匹配一次
  5. <re.Match object; span=(13, 17), match='test'>
  6. re.findall--找到字符串中所有匹配的内容---匹配多次
  7. 3. 匹配单个字符
  8. . 的匹配操作
  9. \d 的匹配操作
  10. \D 的匹配操作
  11. \s 的匹配操作
  12. \S 的匹配操作
  13. \w 的匹配操作
  14. \W 的匹配操作
  15. [] 匹配列举的任意字符
  16. 4. 匹配多个字符
  17. * 的匹配使用
  18. + 的匹配使用
  19. 设置匹配的长度---{m}
  20. 至少匹配次数---{m,}
  21. 匹配{m,n}次
  22. 5. 贪婪和非贪婪
  23. 6. 匹配开头(^)和匹配结尾($)的设置
  24. ^ 可以进行开头字符的设置
  25. $ 设置匹配的结尾字符
  26. 7. ^[] 和 [] 的区别
  27. 8. () 分组匹配
  28. 9. re 模块的其他方法
  29. compile---将正则表达式对象化
  30. sub()---进行大量数据中数据的替换方法
  31. split--通过正则进行拆分的操作
  32. 10. 匹配边界--单词边界

更多推荐文章

查看全部
  • 数据结构:单链表的头插/尾插及头删/尾删操作
  • Unity VR Pico 开发环境一键配置手册
  • 大模型训练数据白皮书发布:大模型是数据要素价值释放的最短路径
  • MiniMax 海螺 AI 视频:图片与文本生成高质量视频
  • 滑动窗口算法核心原理与经典例题解析
  • AI 时代如何提前预见未来:技术人的前瞻性思维与职业策略
  • 大厂面试流程解析与核心技术考点汇总
  • OpenViking 字节跳动开源 AI 代理上下文数据库部署实战
  • artTemplate 模板语法中多余空格导致渲染为空的问题分析
  • PHP 低代码权限管理实战:企业级权限系统搭建
  • 单链表应用:经典算法题与通讯录实现
  • 阿里巴巴开源推理模型 Marco-o1 与多模态 MoE 大模型 Awaker2.5-VL 解析
  • MacOS 下使用 Docker 部署 OpenClaw 并对接飞书机器人
  • LFM2.5-1.2B-Thinking-GGUF 模型部署与 llama.cpp 运行原理详解
  • 修复 Linux 无法开机 VFS Unable to mount root fs on unknown-block 错误
  • 基于ROS与Ego-Planner的无人机动态避障仿真实现
  • 大模型推理框架选型入门:Ollama、llama.cpp 与 vLLM 对比
  • 哈希表的C语言简单实现
  • 基于 DeepFace 与 OpenCV 的实时情绪分析器
  • SpringBoot 源码解析:AnnotationConfigServletWebServerApplicationContext 构造流程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online