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

Python 正则表达式语法与使用指南

Python 正则表达式用于文本模式匹配。涵盖字符类、量词、分组、断言及标志位等核心语法,详解 re 模块的 compile、search、match、findall、sub 及 split 方法。通过实际代码示例展示捕获组、反向引用及多行匹配技巧,帮助开发者高效处理字符串解析任务。

奶糖兔发布于 2025/2/7更新于 2026/9/248 浏览
Python 正则表达式语法与使用指南

Python 正则表达式语法与使用指南

1. 正则表达式基础语法

1.1 字符与字符类

1.1.1 特殊字符

以下字符在正则中具有特殊含义,如需匹配字面值需进行转义:^, $, ., ?, +, *, {, }, |, (, ), [, \

1.1.2 字符类
  1. 包含在 [] 中的一个或多个字符被称为字符类。若未指定量词,默认只匹配其中一个。
  2. 可指定范围,如 [a-zA-Z0-9] 表示 a 到 z、A 到 Z、0 到 9 之间的任意字符。
  3. 左方括号后跟随 ^ 表示否定,如 [^0-9] 表示匹配任意非数字字符。
  4. 字符类内部除 ^, -, ], 外,其他特殊字符无特殊意义。^ 放首位表否定,- 放中间表范围,[ 放首位表本身。
  5. 可使用速记法简化书写。
1.1.3 速记法
  • .:匹配除换行符外的任何字符(re.DOTALL 标志下包含换行)。
  • \d:匹配 Unicode 数字(re.ASCII 下为 0-9)。
  • \D:匹配 Unicode 非数字。
  • \s:匹配 Unicode 空白字符(re.ASCII 下为空格、制表符等)。
  • \S:匹配 Unicode 非空白。
  • \w:匹配 Unicode 单词字符(re.ASCII 下为 [a-zA-Z0-9_])。
  • \W:匹配 Unicode 非单词字符。

1.2 量词

  1. ?:匹配前面的字符 0 次或 1 次。
  2. *:匹配前面的字符 0 次或多次。
  3. +:匹配前面的字符 1 次或多次。
  4. {m}:匹配前面表达式 m 次。
  5. {m,}:匹配前面表达式至少 m 次。
  6. {,n}:匹配前面表达式最多 n 次。
  7. {m,n}:匹配前面表达式至少 m 次,最多 n 次。

注意:以上量词默认为贪婪模式。改为非贪婪模式需在量词后加 ?,如 *?, +?, {m,n}?。

1.3 组与捕获

1.3.1 () 的作用
  1. 捕获:保存括号内内容供后续利用。添加 ?: 可关闭捕获功能,仅用于分组。
  • 组合:将部分内容组合以便使用量词或 |。
  • 1.3.2 反向引用
    1. 组号引用:每个未使用 ?: 的小括号分配一个组号(从 1 开始)。通过 \i 引用前文捕获内容。
    2. 组名引用:使用 (?P<name>...) 命名组,通过 (?P=name) 引用。例如 (?P<word>\w+) \s+ (?P=word) 匹配重复单词。

    注意:反向引用不能在字符类 [] 中使用。

    1.4 断言与标记

    断言不消耗文本,仅对位置施加约束。

    1.4.1 常用断言
    • \b:单词边界。
    • \B:非单词边界。
    • \A:字符串起始处。
    • ^:起始处(MULTILINE 模式下每行开头)。
    • \Z:字符串结尾处。
    • $:结尾处(MULTILINE 模式下每行结尾)。
    • (?=e):正前瞻(后面紧跟 e)。
    • (?!e):负前瞻(后面不跟 e)。
    • (?<=e):正回顾(前面是 e)。
    • (?<!e):负回顾(前面不是 e)。

    示例:查找 hello 但后面必须是 world:

    import re
    pattern = r"hello\s+(?=world)"
    text = "hello world"
    print(re.search(pattern, text)) # 匹配成功
    

    1.5 条件匹配

    (?(id)yes_exp|no_exp):若 id 对应的子表达式匹配成功则匹配 yes_exp,否则匹配 no_exp。

    1.6 正则表达式标志

    1.6.1 使用方法
    1. compile 参数:re.compile(r"...", re.IGNORECASE | re.MULTILINE)。
    2. 内联标志:(?ms)#[da-z]{6}。
    1.6.2 常用标志
    • re.A / re.ASCII:使 \d, \s, \w 等仅匹配 ASCII。
    • re.I / re.IGNORECASE:忽略大小写。
    • re.M / re.MULTILINE:多行匹配,^ 和 $ 匹配每行首尾。
    • re.S / re.DOTALL:. 匹配包括换行符在内的所有字符。
    • re.X / re.VERBOSE:允许跨行注释和空白,需用 \s 表示空格。

    2. Python re 模块使用

    2.1 主要功能

    1. 匹配:检查字符串是否符合正则(返回 bool 或 Match 对象)。
    2. 提取:获取符合要求的文本。
    3. 替换:用新字符串替换匹配内容。
    4. 分割:按正则规则分割字符串。

    2.2 两种调用方式

    1. 编译对象:re.compile() 生成对象后可复用,适合复杂或多次使用的场景。
    2. 模块方法:直接使用 re.match(), re.search() 等,适合单次使用。

    2.3 常用方法详解

    2.3.1 findall

    返回列表。若无分组,含所有匹配项;若有分组,每项为元组(仅含分组内容)。

    import re
    rx = re.compile(r"(\d+)")
    s = "abc123def456"
    result = rx.findall(s)
    print(result) # ['123', '456']
    
    2.3.2 finditer

    返回可迭代对象,每次迭代返回 Match 对象。可调用 group() 查看内容。

    2.3.3 search

    返回第一个匹配对象,未匹配返回 None。只匹配一次。

    match = re.search(r"\d+", "abc123")
    if match:
        print(match.group()) # 123
    
    2.3.4 match

    仅在字符串起始处匹配,否则返回 None。

    2.3.5 sub

    替换匹配内容。x 可为字符串或函数。支持 \g<name> 引用捕获组。

    res = re.sub(r"\d+", "X", "price: 100")
    print(res) # price: X
    
    2.3.6 split

    按正则分割字符串。若存在分组,分组内容也会插入返回列表中。

    rx = re.compile(r"(\d)")
    s = "ab12dk3"
    result = rx.split(s)
    print(result) # ['ab', '1', '2', 'dk', '3']
    

    2.4 匹配对象属性与方法

    • group(g): 获取第 g 组内容,默认 0 为整体。
    • groupdict(): 返回命名组字典。
    • groups(): 返回所有捕获组的元组。
    • start(g), end(g): 获取匹配起止位置。
    • span(): 返回 (start, end) 元组。
    • string: 原始匹配字符串。

    3. 实战案例

    3.1 邮箱验证

    email_pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
    test_email = "[email protected]"
    if re.match(email_pattern, test_email):
        print("Valid Email")
    

    3.2 手机号提取

    text = "Contact me at 13800138000 or 13900139000"
    pattern = r"1[3-9]\d{9}"
    phones = re.findall(pattern, text)
    print(phones) # ['13800138000', '13900139000']
    

    4. 总结

    1. 匹配判断可通过 search/match 返回值是否为 None 实现。
    2. 单次搜索用 search/match,多次遍历用 finditer。
    3. 替换功能推荐 sub,支持函数处理逻辑。
    4. 分割时注意分组内容会保留在结果列表中。
    5. 善用 re.VERBOSE 编写可读性强的复杂正则。

    目录

    1. Python 正则表达式语法与使用指南
    2. 1. 正则表达式基础语法
    3. 1.1 字符与字符类
    4. 1.1.1 特殊字符
    5. 1.1.2 字符类
    6. 1.1.3 速记法
    7. 1.2 量词
    8. 1.3 组与捕获
    9. 1.3.1 () 的作用
    10. 1.3.2 反向引用
    11. 1.4 断言与标记
    12. 1.4.1 常用断言
    13. 1.5 条件匹配
    14. 1.6 正则表达式标志
    15. 1.6.1 使用方法
    16. 1.6.2 常用标志
    17. 2. Python re 模块使用
    18. 2.1 主要功能
    19. 2.2 两种调用方式
    20. 2.3 常用方法详解
    21. 2.3.1 findall
    22. 2.3.2 finditer
    23. 2.3.3 search
    24. 2.3.4 match
    25. 2.3.5 sub
    26. 2.3.6 split
    27. 2.4 匹配对象属性与方法
    28. 3. 实战案例
    29. 3.1 邮箱验证
    30. 3.2 手机号提取
    31. 4. 总结

    更多推荐文章

    查看全部
    • MySQL 数据库基础入门总结
    • HTML 标签详解:网页骨架与语义化布局实战
    • Copilot 两周实测:开发效率确实翻了一倍多,但别被噱头带偏
    • Linux 服务器部署 OpenClaw 教程
    • C++ std::vector 动态数组核心用法与原理
    • 2026 年上半年主流 AIGC 长文本写作软件实测:5 款头部工具优缺点解析
    • 从原理到实践:AIGC与ASR/TTS技术在智能语音交互中的融合应用
    • Windows 至鸿蒙:ToDesk、Splashtop、TeamViewer、向日葵跨平台远控对比
    • Python 文本分析实战:基于 TF-IDF 的《红楼梦》关键词提取
    • WebLogic 应用服务器简介及登录方法
    • C++ 实现 AVL 平衡二叉搜索树
    • 人类与 AI 的意群阅读机制及英语学习技巧
    • MVP 至高并发:AI 在前后端开发中的差异化落地实践
    • 使用 Continue 插件本地部署 AI 代码助手替代 Cursor 或 GitHub Copilot
    • Git Stash 机制详解与 VSCode 可视化操作指南
    • AI 在测试领域的四大核心应用场景与落地实践
    • 基于 n8n 与 AI 模型的智能写作工作流构建
    • Python 分支结构与循环结构应用实战
    • 基于 Trae Solo 与 GLM-4.6 的 AI 小说创作平台开发实践
    • ToDesk/顺网/海马云部署 DeepSeek 实测对比

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如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