python中re.findall的一个捕获分组问题

问题描叙

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/1/12 上午8:39
# @Author  : hiwower
# @Site    : 
# @File    : test-mac.py
# @Software: PyCharm

import  re
p = '^([A-F0-9]{2}:){5}[A-F0-9]{2}$'
string = '81:0B:7C:18:32:A0'
print(re.findall(p,string))
print(re.match(p,string).group())

上面的代码期望执行结果是匹配mac地址 81:0B:7C:18:32:A0
实际输出
['32:']
81:0B:7C:18:32:A0

因此只有re.match正确得到预期。而findall没有。

原因

直接查看findall的定义


def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.

    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.

    Empty matches are included in the result."""
    return _compile(pattern, flags).findall(string)

这里的理解我翻译以下:
返回结果是 一个列表;
列表中每个元素的值的类型,取决于你的正则表达式的写法
1、当你的正则表达式中有(带捕获的)分组(简单可理解为有括号)
值,是分组匹配的结果
2、当你的正则表达式中没有捕获的组(不分组,或非捕获分组)
值,是你的正则表达式所匹配到的单个完整的字符串

分析

以上面的例子来分析
p = '^([A-F0-9]{2}:){5}[A-F0-9]{2}$' 存在带捕获的分组。
因此得到的该分组的值。因此结果是 ['32:']

再举个其他的例子

print(re.findall('(ab)+123','ababab123 abc123 abb123 aa1234 ab1234'))

这里期望是匹配出 ['ababab123', 'ab123']
但是实际得到的只有 ['ab', 'ab']

正确的写法

print(re.findall('(?:ab)+123','ababab123 abc123 abb123 aa1234 ab1234'))

解决

一种方法是去掉 捕获分组。就是去掉()

p = '^[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}$'

一种方法是将捕获的分组修改成 非捕获的分组。只需要添加?:即可。
p = '^(?:[A-F0-9]{2}:){5}[A-F0-9]{2}$'

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

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 13,020评论 0 13
  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 12,105评论 0 99
  • #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...
    mapuboy阅读 5,551评论 0 51
  • 注:参考《JavaScript语言精粹》第七章和第八章。 一、正则表达式的概念,作用 1.概念:正则表达式是一门简...
    yaya520阅读 4,272评论 0 1
  • 声明:本文基本是转载千叶的博客,里面稍微修改。 一、通过第三方类库正则匹配 在ios项目中可以借用第三方框架Reg...
    黑夜0411阅读 4,973评论 0 0

友情链接更多精彩内容