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

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')]

我知道我可以简单地通过:拆分,这样就可以完成任务了。我只是希望能够在一个步骤中使用一个正则表达式来完成匹配和值提取。


如何验证MAC地址的格式 - Fredrik Pihl
@FredrikPihl 谢谢,但是这个线程只回答了匹配的问题,这就是我已经有的。但是我正在寻找一个能够进行匹配和提取:之间值的模式。 - replay
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})'的出现次数,并使用'\:'连接它们。


我喜欢使用乘法器来处理模式字符串,而不是正则表达式量词的想法。谢谢! - replay
2
这是我现在使用的解决方案,非常完美:re.compile('^' + '[\:\-]'.join(['([0-9A-F]{1,2})']*6) + '$', re.IGNORECASE) - replay
"{1,2}" 的含义是什么? - Itai Ganot
这意味着它之前的子表达式发生一次或两次。因此,{1,3}表示“一次、两次或三次”(不仅仅是“一次或三次”)。 - Vedran Šego

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
    }

这个问题特别涉及到Python,这个答案不适用于此。 - Daniel G

0

我作弊了,使用了mauro.stettler提交的变体。我认为这是一个相当清晰和简单的一行代码。 mac_validation 应该返回 TrueFalse。谢谢Mario!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接