我正在尝试首先检查字符串是否确认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
只需:
即可完成这项工作。我只是希望能够通过一个正则表达式一步完成匹配和值提取。
答案 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
应该返回True
或False
。谢谢马里奥!
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
}