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
相关产品推荐
相关产品推荐

