正则表达式匹配MAC地址并提取它的值

时间:2013-09-13 09:33:04

标签: python regex

我正在尝试首先检查字符串是否确认MAC地址的格式,如果确实如此,我想从字符串中提取所有字节值。

到目前为止,我写了这篇文章,并且如果mac地址的格式正确与否,它会成功匹配:

 mac_regx = re.compile(r'^([0-9A-F]{1,2})(\:[0-9A-F]{1,2}){5}$', re.IGNORECASE)

但是当我使用这个正则表达式提取字节值时,我只得到第一个和最后一个:

(Pdb) print(mac_regx.findall('aa:bb:cc:dd:ee:ff'))
[('aa', ':ff')]

我知道我可以split只需:即可完成这项工作。我只是希望能够通过一个正则表达式一步完成匹配和值提取。

3 个答案:

答案 0 :(得分:2)

如果您想要所有比赛,则应避免使用{5}

mac_regx = re.compile(r'^([0-9A-F]{1,2})\:([0-9A-F]{1,2})\:([0-9A-F]{1,2})\:([0-9A-F]{1,2})\:([0-9A-F]{1,2})\:([0-9A-F]{1,2})$', re.IGNORECASE)

或更短,

mac_regx = re.compile(r'^([0-9A-F]{1,2})' + '\:([0-9A-F]{1,2})'*5 + '$', re.IGNORECASE)

您还可以列出6个字符串'[0-9A-F]{1,2})',并将其与'\:'联系起来。

答案 1 :(得分:0)

我作弊并使用mauro.stettler提交的变体。我认为这是非常明确和直接的一个班轮。 mac_validation应该返回TrueFalse。谢谢马里奥!

import re
mac_validation = bool(re.match('^' + '[\:\-]'.join(['([0-9a-f]{2})']*6) + '$', mac_input.lower()))

答案 2 :(得分:0)

有许多不同的可能格式。因此,单个正则表达式可能很难处理它们。

如果您愿意使用代码而不是正则表达式,the IPAddress Java library将同时处理各种格式。

该库将读取MAC地址的最常见格式,如aa:bb:cc:dd:ee:ff,aa-bb-cc-dd-ee-ff,aabb.ccdd.eeff,aa bb cc dd ee ff,它支持48或64位的地址,还允许您指定地址范围,如aa-ff:bb:cc:*:ee:ff

验证地址是否有效:

    String str = "aa:bb:cc:dd:ee:ff";
    MACAddressString addrString = new MACAddressString(str);
    try {
         MACAddress addr = addrString.toAddress();
         //extract values with addr.getSegment(i).getLowerSegmentValue()
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }