5

我试图首先检查一个字符串是否确认 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通过:,这样就可以完成这项工作。我只是希望能够通过一个正则表达式一步完成匹配和值提取。

4

3 回答 3

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})'并将它们与'\:'.

于 2013-09-13T09:43:25.283 回答
0

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

import re
mac_validation = bool(re.match('^' + '[\:\-]'.join(['([0-9a-f]{2})']*6) + '$', mac_input.lower()))
于 2015-10-08T19:57:32.307 回答
0

有许多不同的可能格式。因此,单个正则表达式可能难以处理所有这些。

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

该库将读取 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
    }
于 2017-12-13T17:45:29.270 回答