如何将列表元素的alid与vhpn字段提取至新列表resultList
提取日志字符串中特定字段的Python实现方案
我来给你几个实用的Python实现思路,刚好能解决你从日志字符串里提取alid和vhpn字段的需求:
方法1:字符串分割遍历(直观易懂,适合新手)
这种方法通过拆分字符串的方式逐个处理键值对,逻辑清晰,容易理解:
myList = ['14:14:12.294 0,Type=Xover,Count=179,mcuTs=0x000DC827,fpgaTs=0xDB3C,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535', '14:14:12.295 0,Type=Bndry,Count=88,mcuTs=0x000DCB00,fpgaTs=0x9DEC,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535', '14:14:12.295 0,Type=IsXover,Count=136,mcuTs=0x000DC822,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535'] resultList = [] for log_str in myList: # 把日志字符串按逗号拆分成单个键值对 kv_pairs = log_str.split(',') alid = None vhpn = None for pair in kv_pairs: # 拆分键和值 key, value = pair.split('=') if key == 'alid': alid = value elif key == 'vhpn': vhpn = value # 把提取到的两个字段值加入结果列表(可以按需求存成元组或字典) resultList.append((alid, vhpn)) print(resultList)
输出结果会是:[('65535', '65535'), ('65535', '65535'), ('65535', '65535')]
方法2:正则表达式(简洁高效,适合批量处理)
如果日志格式固定,用正则表达式可以一次性匹配到目标字段,代码更简洁:
import re myList = ['14:14:12.294 0,Type=Xover,Count=179,mcuTs=0x000DC827,fpgaTs=0xDB3C,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535', '14:14:12.295 0,Type=Bndry,Count=88,mcuTs=0x000DCB00,fpgaTs=0x9DEC,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535', '14:14:12.295 0,Type=IsXover,Count=136,mcuTs=0x000DC822,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535'] resultList = [] # 定义正则模式,匹配alid和vhpn的数值部分 pattern = re.compile(r'alid=(\d+).*?vhpn=(\d+)') for log_str in myList: match = pattern.search(log_str) if match: alid_val, vhpn_val = match.groups() resultList.append((alid_val, vhpn_val)) print(resultList)
这个方法的优势是处理速度快,尤其是当日志数量很大的时候,效率更高。
方法3:转字典提取(可扩展性强,适合多字段提取)
如果以后可能需要提取更多字段,把日志字符串转成字典会更灵活:
myList = ['14:14:12.294 0,Type=Xover,Count=179,mcuTs=0x000DC827,fpgaTs=0xDB3C,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535', '14:14:12.295 0,Type=Bndry,Count=88,mcuTs=0x000DCB00,fpgaTs=0x9DEC,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535', '14:14:12.295 0,Type=IsXover,Count=136,mcuTs=0x000DC822,lp-isD=1,lp-xoD=2344,alid=65535,cdr=65535,vhpn=65535,va=65535'] resultList = [] for log_str in myList: # 拆分键值对并转成字典 log_dict = dict(pair.split('=') for pair in log_str.split(',')) # 从字典中提取目标字段 alid_val = log_dict.get('alid') vhpn_val = log_dict.get('vhpn') resultList.append((alid_val, vhpn_val)) print(resultList)
这种方式的好处是,后续如果要提取cdr、va等其他字段,直接修改提取的键名即可,非常方便。
内容的提问来源于stack exchange,提问作者seyet
相关产品推荐
相关产品推荐

