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

解析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

错误原因

  1. 表头行未过滤:代码遍历所有行,包括表头的第二、第三行(如Hardware address/),这些行拆分后元素数量不足,访问索引2时触发越界错误。
  2. 日期字段拆分错误:Lease expiration是多单词组成的字符串,split()会将其拆分为多个元素,无法通过固定索引获取完整值。
  3. 键名不匹配:字典中定义的键是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:17:06