如何使用正则表达式从ifconfig输出中正确提取MAC地址?
问题原因
- 正则首尾的
^和$是行/字符串首尾锚定符,要求整个匹配内容从字符串开头到结尾全是MAC地址,但你的输入是完整的ifconfig输出,MAC地址前有ether前缀、后有其他内容,完全不符合锚定规则,所以匹配失败。 - 你的正则里写了两个捕获分组
([0-9A-Fa-f]{2}[:-])和([0-9A-Fa-f]{2}),就算匹配成功,re.findall也只会返回分组里的内容,不会返回完整的MAC地址字符串。
解决方法
修改正则即可,可参考如下两种写法:
写法1:通用MAC匹配
import re def cleanOutput(output): # ?: 表示非捕获组,\b 是单词边界,避免匹配到ipv6地址里的类似片段 mac_list = re.findall(r'\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b', output) if mac_list: return mac_list[0] return ""
写法2:带ether前缀精准匹配
如果你的输出里MAC地址前面固定带ether 前缀,可以直接精准匹配,避免误匹配其他内容:
import re def cleanOutput(output): mac_match = re.search(r'ether\s+((?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})', output) if mac_match: return mac_match.group(1) return ""
调用修改后的函数即可直接拿到6a:57:e6:6e:9e:5e的目标结果。
内容的提问来源于stack exchange,提问作者Ruth Edges
相关产品推荐
相关产品推荐

