MAC地址列表交集为空排查:存在共同地址却无法匹配
问题分析与解决
初始数据
s3_mac_string = "[['50:9a:4c:17:b4:f5', '54:13:79:70:6b:97', '54:13:79:70:6b:98', '56:13:79:70:6b:97', '66:13:79:70:6b:97'], ['c8:34:8e:72:3f:89', 'c8:34:8e:72:3f:8a', 'ca:34:8e:72:3f:89'], ['54:ee:75:b7:9f:a4', 'f0:d5:bf:bf:65:ee', 'f0:d5:bf:bf:65:ef', 'f2:d5:bf:bf:65:ee']]" huntress_unseen_mac = [['80:86:f2:da:dd:ce', '80:86:f2:da:dd:cf', '80:86:f2:da:dd:d2', '82:86:f2:da:dd:ce', 'ec:f4:bb:40:25:be'], ['10:60:4b:73:39:db'], ['a4:bb:6d:3f:ed:10'], ['a4:bb:6d:3e:7b:e1'], ['d0:3c:1f:77:84:b3', 'd0:3c:1f:77:84:b4', 'f0:d5:bf:bf:65:ee', 'd0:3c:1f:77:84:b7']]
你忽略了两个核心问题
1. Convert函数解析字符串的方式错误
你的Convert函数手动替换括号和引号后用逗号分割,会导致每个MAC地址前面多了一个空格。比如原字符串里的', '分割后,得到的元素是' 54:13:79:70:6b:97'(前面带空格),而huntress那边的MAC是无空格的,自然匹配不上。
而且手动替换字符的方式非常脆弱,一旦字符串格式有变化就会出错。正确的做法是用Python内置的ast.literal_eval直接解析字符串为嵌套列表,再展开成一维列表:
import ast def Convert(string): # 先解析成嵌套列表,再展开为一维列表并标准化格式 nested_list = ast.literal_eval(string) return [mac.strip().lower() for sublist in nested_list for mac in sublist]
2. 未正确展开huntress_unseen_mac的嵌套列表
huntress_unseen_mac是嵌套列表(列表里包含列表),你直接遍历外层列表并转成字符串,得到的是类似"['80:86:f2:da:dd:ce', ...]"的字符串,根本不是单个MAC地址,当然无法和s3的MAC匹配。
需要先展开嵌套列表,提取每个单独的MAC地址:
# 展开嵌套列表,同时转小写并去除多余空格 huntress_macs = [mac.strip().lower() for sublist in huntress_unseen_mac for mac in sublist]
修正后的完整main函数
import ast def Convert(string): nested_list = ast.literal_eval(string) return [mac.strip().lower() for sublist in nested_list for mac in sublist] def main(): s3_mac_string = get_mac_addresses_from_s3() huntress_unseen_mac = get_unseen_mac_huntress() s3_macs = Convert(s3_mac_string) # 展开huntress的嵌套列表并标准化格式 huntress_macs = [mac.strip().lower() for sublist in huntress_unseen_mac for mac in sublist] # 用集合求交集,高效且简洁 common_macs = set(s3_macs) & set(huntress_macs) print(f"Common MACs: {list(common_macs)}")
运行后会正确输出共同的MAC地址:['f0:d5:bf:bf:65:ee']
内容的提问来源于stack exchange,提问作者pandapunk94
相关产品推荐
相关产品推荐

