正则中捕获组和非捕获组区别

举报
神的孩子在歌唱 发表于 2024/09/26 23:39:34 2024/09/26
【摘要】 捕获组和非捕获组这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。作者:神的孩子都在歌唱一. 捕获组(Capturing Groups)定义: 捕获组用于提取匹配的子字符串。它们会记住匹配的内容,允许你在后续的操作中引用这些内容。语法: 使用圆括号 () 来定义捕获组。用途: 适用于需要从匹配的文本中提取和使用某些部分的情况。例如,你可以从一个日期字符串中提取年、月...

捕获组和非捕获组

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱


一. 捕获组(Capturing Groups)

  • 定义: 捕获组用于提取匹配的子字符串。它们会记住匹配的内容,允许你在后续的操作中引用这些内容。

  • 语法: 使用圆括号 () 来定义捕获组。

  • 用途: 适用于需要从匹配的文本中提取和使用某些部分的情况。例如,你可以从一个日期字符串中提取年、月、日。

  • 示例:

    (\d{4})-(\d{2})-(\d{2})
    • 这个正则表达式可以用来匹配日期格式 YYYY-MM-DD。它包含三个捕获组,分别用于提取年份、月份和日期。

    import re
    pattern = re.compile(r"(\d{4})-(\d{2})-(\d{2})")
    match = pattern.search("2024-09-23")
    if match:
        print(match.group(1))  # 2024
        print(match.group(2))  # 09
        print(match.group(3))  # 23

image-20240923160040953


二. 非捕获组(Non-Capturing Groups)

  • 定义: 非捕获组用于组织正则表达式中的模式,但不会记住匹配的内容。它们仅用于控制匹配的逻辑,而不会生成回溯。

  • 语法: 使用 (?:...) 来定义非捕获组。

  • 用途: 适用于需要分组以控制正则表达式的优先级,但不需要保存组内容的情况。例如,你可以使用非捕获组来指定选项或多重模式。

  • 示例:

    (?:\d{4})-(?:\d{2})-(?:\d{2})
    • 这个正则表达式与上面的示例类似,但使用非捕获组来匹配日期。非捕获组不会保存匹配的内容,仅用于组织模式。

    import re
    pattern = re.compile(r"(?:\d{4})-(?:\d{2})-(?:\d{2})")
    match = pattern.search("2024-09-23")
    if match:
        print("Match found!")

image-20240923160213822

三. 区别

  1. 捕获:

    • 捕获组会记住匹配的文本,允许你在后续操作中引用这些文本。

    • 非捕获组不会记住匹配的文本,只是用于匹配逻辑上的分组。

  2. 性能:

    • 捕获组会引入额外的开销,因为需要存储匹配的内容。

    • 非捕获组通常具有更高的性能,尤其是在复杂模式中。

  3. 引用:

    • 捕获组可以通过其组号引用,使用 group() 方法获取。

    • 非捕获组不能被引用,因为它们不存储匹配的内容。

四. 选择使用

  • 使用捕获组: 当你需要从匹配的文本中提取和操作特定的子串时。

  • 使用非捕获组: 当你只需要分组以控制模式的优先级,而不需要存储匹配内容时。



作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。