You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则re.findall匹配MAC地址仅返回捕获组而非完整字符串如何解决

问题原因

Python的re.findall方法存在规则:当正则表达式中包含捕获组时,返回结果会优先输出所有捕获组的匹配内容,而非完整匹配结果。
你当前的正则r"^([0-9A-Fa-f]{2}[:-]?){6}"中,([0-9A-Fa-f]{2}[:-]?)是一个显式捕获组,该组重复匹配6次时仅会保留最后一次的匹配结果(也就是每个MAC地址的最后两位),所以最终得到的是['FE', '38', '38']。


解决方案

把原来的捕获组修改为非捕获组即可,非捕获组的语法是在组开头加?:,修改后的代码如下:

import re
text = """20:0C:C8:0D:51:FE
75:85:2B:2B:80:38
75-85-2B-2B-80-38
"""
x = re.findall(
    r"^(?:[0-9A-Fa-f]{2}[:-]?){6}", text, re.M)
print(x)

运行后输出就是你期望的完整MAC地址列表:
['20:0C:C8:0D:51:FE', '75:85:2B:2B:80:38', '75-85-2B-2B-80-38']


可选优化(非必需)

如果需要严格校验MAC地址的分隔符必须统一(不能同时出现:和-),可以用更严谨的正则:

x = re.findall(r"^[0-9A-Fa-f]{2}(?:[:-][0-9A-Fa-f]{2}){5}$", text, re.M)

这个正则可以避免匹配到类似20:0C-C8:0D-51:FE这种格式不统一的非法MAC地址。


内容的提问来源于stack exchange,提问作者Joyp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:03