Python 正则表达式的非捕获组详解

 更新时间:2025年02月21日 10:20:40   作者:qq_27390023  
非捕获组 ((?:...)) 在 Python 正则表达式中用于分组但不保存匹配结果,通过 '?' 表示非捕获标记,常用于简化正则表达式和提高性能,它在选择、提高匹配性能和结构化复杂表达式方面都有优势,本文介绍Python 正则表达式的非捕获组的相关知识,感兴趣的朋友一起看看吧

在 Python 正则表达式中,非捕获组 ((?:...)) 是一种用于分组不保存匹配结果的结构。它与普通的捕获组 (...) 语法类似,但在匹配时不会创建编号或命名的组,常用于简化正则表达式和提高性能。

1. 语法

(?:pattern)
  • ?: 表示非捕获标记。
  • pattern 是要匹配的正则表达式模式。

 2. 示例对比

普通捕获组 ()

import re
text = "cat dog"
# 捕获组
match = re.search(r"(cat) (dog)", text)
print(match.groups())  # ('cat', 'dog')
print(match.group(1))  # cat
print(match.group(2))  # dog

结果:groups() 返回所有捕获的子组,group(1)group(2) 通过编号访问。

非捕获组 (?:...)

import re
text = "cat dog"
# 非捕获组
match = re.search(r"(?:cat) (?:dog)", text)
print(match.groups())  # ()
print(match.group(0))  # cat dog

结果:groups() 返回空元组,因为没有捕获的组

 3. 主要应用场景

1️⃣ 选择(|)时减少复杂性

import re
text = "color colour"
# 捕获组
matches = re.findall(r"(col(or|our))", text)
print(matches)  # [('color', 'or'), ('colour', 'our')]
# 非捕获组
matches = re.findall(r"col(?:or|our)", text)
print(matches)  # ['color', 'colour']

优势(?:or|our) 仅用于匹配,不保存子组,结果更简洁。

2️⃣ 提高匹配性能

import re
import time
text = "ab" * 100000
# 捕获组
start = time.time()
re.search(r"(ab)+", text)
print("捕获组耗时:", time.time() - start)
# 非捕获组
start = time.time()
re.search(r"(?:ab)+", text)
print("非捕获组耗时:", time.time() - start)

优势:非捕获组不保存匹配内容,因此速度更快内存占用更少

3️⃣ 结构化复杂表达式

import re
text = "2024-02-19"
# 捕获组
match = re.search(r"(\d{4})-(\d{2})-(\d{2})", text)
print(match.groups())  # ('2024', '02', '19')
# 非捕获组
match = re.search(r"(?:\d{4})-(?:\d{2})-(?:\d{2})", text)
print(match.groups())  # ()

优势:结构清晰,无需保存中间匹配结果。

4. 捕获组 vs. 非捕获组对比

特性捕获组 (pattern)非捕获组 (?:pattern)
结果保存保存,group() 可访问不保存,无 group() 结果
处理性能慢(需要保存匹配)快(无需保存匹配)
复杂性复杂,需管理组索引简化,适用于逻辑分组
应用场景需要保存匹配时仅匹配不保存时

5. 结论

  • 需要子组内容:使用普通捕获组 (...),可通过 group(n) 获取。
  • 仅控制结构:使用非捕获组 (?:...),提高性能并简化表达式。
  • 性能优化:非捕获组减少内存消耗,适合大型文本处理。

到此这篇关于Python 正则表达式的非捕获组介绍的文章就介绍到这了,更多相关Python 正则表达式非捕获组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 实现简单的FTP程序

    python 实现简单的FTP程序

    这篇文章主要介绍了python 实现简单的FTP程序,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • videocapture库制作python视频高速传输程序

    videocapture库制作python视频高速传输程序

    python视频高速传输程序,大家参考使用吧
    2013-12-12
  • Python遍历某目录下的所有文件夹与文件路径

    Python遍历某目录下的所有文件夹与文件路径

    这篇文章主要介绍了Python遍历某目录下的所有文件夹与文件路径 以及输出中文乱码问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 使用Python requests库发送JSON数据的POST请求步骤

    使用Python requests库发送JSON数据的POST请求步骤

    在Python这个强大的编程语言中,requests库是一个广泛使用且功能强大的HTTP请求库,发送POST请求并附带JSON数据是一个非常常见的需求,本文给大家介绍了如何用Python的requests库发送JSON数据的POST请求,需要的朋友可以参考下
    2024-06-06
  • Python数据分析之pandas读取数据

    Python数据分析之pandas读取数据

    Pandas读取的文件主要有CSV,TXT和JSON,今天就整理了这3种文件格式的读取和导出代码,文中有非常详细的代码示例及介绍,需要的朋友可以参考下
    2021-06-06
  • Django前后端分离csrf token获取方式

    Django前后端分离csrf token获取方式

    这篇文章主要介绍了Django前后端分离csrf token获取方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详解windows python3.7安装numpy问题的解决方法

    详解windows python3.7安装numpy问题的解决方法

    这篇文章主要介绍了windows python3.7安装numpy问题的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • pytest用例执行顺序和跳过执行详解

    pytest用例执行顺序和跳过执行详解

    本文主要介绍了pytest用例执行顺序和跳过执行详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 答题辅助python代码实现

    答题辅助python代码实现

    这篇文章主要为大家详细介绍了答题辅助python代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python任务调度利器之APScheduler详解

    Python任务调度利器之APScheduler详解

    所谓的任务调度是指安排任务的执行计划,即何时执行,怎么执行等。这篇文章主要介绍了Python任务调度利器之APScheduler详解,需要的朋友可以参考下
    2020-04-04

最新评论