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

如何从字典Message键提取首个IP并新增IP键?解决迭代报错问题

解决字典迭代时大小改变的错误并提取IP

首先,你遇到的「字典在迭代时大小改变」错误,是因为你在遍历Dict.items()的过程中直接给字典新增了host/IP address键——Python不允许在迭代字典的同时修改它的大小,这会打乱迭代的内部状态。

咱们直接简化代码逻辑,不需要遍历字典的所有键值对,只针对每个字典的Message字段处理就行,具体解决方案如下:

修正后的代码示例

import re

# 你的原始日志字典列表
data = [
    {'Date': 'Jun 29', 'Time': '03:22:22', 'PID': '13251', 'Message': 'Authentication failed from 163.27.187.39 (163.27.187.39): Permission denied in replay cache code', 'Access Type': 'Success'},
    {'Date': 'Jun 29', 'Time': '03:22:22', 'PID': '13263', 'Message': 'connection from 61.74.96.178 () at Wed Jun 29 03:22:22 2005', 'Access Type': 'Success'}
]

# 预编译IP正则表达式(重复使用时更高效)
ip_regex = re.compile(r"\b[0-9]{1,3}(?:\.[0-9]{1,3}){3}\b")

for entry in data:
    # 获取Message内容,没有则为空字符串
    message_content = entry.get('Message', '')
    # 查找第一个匹配的IP地址
    ip_match = ip_regex.search(message_content)
    # 给当前字典新增IP键,有匹配就取IP,否则为空
    entry['IP'] = ip_match.group() if ip_match else ''

# 验证结果
for entry in data:
    print(entry)

关键改进点说明

  • 避免迭代时修改字典:直接针对每个字典的Message字段处理,不再遍历items(),从根源上解决了迭代时大小改变的问题。
  • 更精准的正则:添加了\b单词边界,避免匹配到类似123.456.789.1011这种不符合IP规则的长数字串;同时用search替代findall,因为我们只需要第一个匹配的IP,效率更高。
  • 容错处理:用entry.get('Message', '')处理可能缺失Message键的情况,避免抛出KeyError。
  • 预编译正则:把正则表达式预编译成对象,多次使用时性能更好。

内容的提问来源于stack exchange,提问作者Aaron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:57:56