3.3.4 非捕获型分组

目前为止,总共介绍了括号的三种用途:

  • 分组:将相关的元素归拢到一起,构成单个元素;
  • 多选结构:规定可能出现的多个子表达式;
  • 引用分组:将子表达式匹配的文本存储起来,供之后引用

这三种用途并不是彼此独立的,而是相互重叠的:

  • 单纯的分组可以视为“只包含一个多选分支的多选结构”;
  • 整个多选结构也会被视为单个元素,可以由一个量词限定;
  • 只要出现了括号,正则表达式在匹配时就会把括号内的子表达式存储起来提供引用;

但有时如果不需要引用,保存括号分组的引用信息就会影响性能;如果表达式比较复杂,要处理的文本又很多,更可能严重影响性能。

为了解决这种问题,正则表达式提供了非捕获分组(non-capturing group)。非捕获分组类似普通捕获分组,只是在开括号后面紧跟一个问号和冒号(?:...),这样的括号叫做非捕获型括号,它只能限定量词的作用范围,不能捕获文本。在引用分组时,分组的编号同样会按开括号出现的顺序从左向右递增,只是必须以捕获分组为准,非捕获分组会略过。

例3-35 非捕获型分组的使用

# 非捕获型分组
print(re.search(r'(\d{4})-(\d{2})-(\d{2})', '2018-12-20').group(1))  # 2018
print(re.search(r'(?:\d{4})-(\d{2})-(\d{2})', '2018-12-20').group(1))  # 12

非捕获型分组不需要保存匹配的文本,整个表达式的效率也因此提高,但是看起来不如捕获分组美观。不过,如果只需要使用括号的分组或者读选结构的功能,而没有用到引用分组,则应当尽量使用非捕获型括号。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 正则表达式有很多流派,也有很多的特性,不同的语言支持度也是不一样的。本篇文章是写Python中的正则表达式的用法的...
    Moscow1147阅读 4,836评论 0 0
  • 个人根据《正则指引》内容总结记录,侵删!! 转载至我的博客 最近看了编译原理方面的书,觉得正则表达式非常重要,在各...
    J退後阅读 3,757评论 0 0
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 9,552评论 0 20
  • 构建扫描器程序的两个重要方法 boolean hitEnd() 返回true,说明结尾有更多的字符可能会改变本次的...
    mxl0814阅读 3,777评论 0 1
  • 今年儿子放暑假那会,我刚刚学会在网上买火车票,以前都是儿子给买,用智行购票软件,还没来得及沾沾自喜,就出了一件糗事...
    岁月静好如诗阅读 3,477评论 2 5

友情链接更多精彩内容