解析DHCP租约文本遇IndexError,求可行解析方案
解析DHCP租约文本的问题与解决方法
问题描述
需要解析以下DHCP租约文本:
IP address Client-ID/ Lease expiration Type Hardware address/ User name 10.10.10.10 0000.0000.0000.0000 Jan 29 2024 03:20 AM Automatic 10.10.10.11 0000.0000.0000.0001 Jan 29 2024 03:21 AM Automatic 10.10.10.12 0000.0000.0000.0002 Jan 29 2024 03:22 AM Automatic
编写的Python代码如下:
bindings = [] for row in output.splitlines(): bindings.append( {'IP': row.split()[0], 'Client-ID/': row.split()[1], 'Lease expiration': row.split()[2], 'Type': row.split()[3]} ) print([binding.get('IP') + " " + binding.get('Client-ID') for binding in bindings])
执行后报错:
'Lease expiration': row.split()[2], IndexError: list index out of range
错误原因
- 表头行未过滤:代码遍历所有行,包括表头的第二、第三行(如
Hardware address/),这些行拆分后元素数量不足,访问索引2时触发越界错误。 - 日期字段拆分错误:
Lease expiration是多单词组成的字符串,split()会将其拆分为多个元素,无法通过固定索引获取完整值。 - 键名不匹配:字典中定义的键是
Client-ID/,但后续取值用的是Client-ID,会导致无法获取对应值。
正确实现方案
方案1:正则匹配(推荐,适配固定列格式)
利用正则表达式精准匹配每行的各个字段,过滤无效行:
import re output = """IP address Client-ID/ Lease expiration Type Hardware address/ User name 10.10.10.10 0000.0000.0000.0000 Jan 29 2024 03:20 AM Automatic 10.10.10.11 0000.0000.0000.0001 Jan 29 2024 03:21 AM Automatic 10.10.10.12 0000.0000.0000.0002 Jan 29 2024 03:22 AM Automatic""" bindings = [] # 匹配IP、Client-ID、租期时间、租约类型的正则 pattern = re.compile(r'(\d+\.\d+\.\d+\.\d+)\s+([\w.]+)\s+([\w\s:]+(?:AM|PM))\s+(\w+)') for row in output.splitlines(): row = row.strip() # 跳过表头行和空行 if not row or row in ('IP address Client-ID/ Lease expiration Type', 'Hardware address/', 'User name'): continue match_result = pattern.match(row) if match_result: ip, client_id, lease_exp, lease_type = match_result.groups() bindings.append({ 'IP': ip, 'Client-ID': client_id, 'Lease expiration': lease_exp.strip(), 'Type': lease_type }) # 遍历输出结果 print([f"{item['IP']} {item['Client-ID']}" for item in bindings])
方案2:拆分后合并字段
通过判断元素数量过滤有效行,合并日期字段:
output = """IP address Client-ID/ Lease expiration Type Hardware address/ User name 10.10.10.10 0000.0000.0000.0000 Jan 29 2024 03:20 AM Automatic 10.10.10.11 0000.0000.0000.0001 Jan 29 2024 03:21 AM Automatic 10.10.10.12 0000.0000.0000.0002 Jan 29 2024 03:22 AM Automatic""" bindings = [] for row in output.splitlines(): parts = row.split() # 数据行拆分后至少有8个元素(IP+ClientID+日期4部分+类型) if len(parts) < 8: continue bindings.append({ 'IP': parts[0], 'Client-ID': parts[1], 'Lease expiration': ' '.join(parts[2:6]), 'Type': parts[6] }) # 遍历输出结果 print([f"{item['IP']} {item['Client-ID']}" for item in bindings])
两种方案执行后都会输出预期的列表:
['10.10.10.10 0000.0000.0000.0000', '10.10.10.11 0000.0000.0000.0001', '10.10.10.12 0000.0000.0000.0002']
内容的提问来源于stack exchange,提问作者user1857654
相关产品推荐
相关产品推荐

