如何从字典中的键 "消息 "中提取第一个IP地址,然后用提取的IP地址添加一个名为 "IP "的新键?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从字典中的键 "消息 "中提取第一个IP地址,然后用提取的IP地址添加一个名为 "IP "的新键?相关的知识,希望对你有一定的参考价值。

所以我有一个列表,里面有我从日志文件生成的字典。我想用从 "消息 "中提取的IP地址创建一个名为 "IP "的新键。

这是一个字典列表的例子。

[{'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'}]

我想过使用regex,但我得到一个错误,说我的字典在迭代过程中改变了大小。

for Dict in data:
    for k,v in Dict.items():
        if k == 'Message':
            re.findall(r"[0-9]+(?:\.[0-9]+){3}\s", v)
            Dict["host/IP address"] = re.findall(r"[0-9]+(?:\.[0-9]+){3}\s", v)
        else:
            Dict["host/IP address"] = "" 
    print(Dict)
答案

你不需要遍历字典,因为你知道钥匙,只要从钥匙的IP创建新的钥匙就可以了 Message.

  • 我去掉... \s 中,因为你不希望在regex中出现空格。
  • r"[0-9]{1,3}(?:\.[0-9]{1,3}){3} 更好的检查数字组长度的regex。[1-3]
  • 使用 [0] 最后从 Message如果你想知道所有找到的IP列表,请删除它。

在没有IP的情况下,你应该先计算IP,然后添加关于结果的映射 findall

for value in data:
    ips = re.findall(r"[0-9]{1,3}(?:\.[0-9]{1,3}){3}", value['Message'])
    if ips:
        value["host/IP address"] = ips[0]

如果你想在没有IP的情况下放一个空的字符串。

for value in data:
    ips = re.findall(r"[0-9]{1,3}(?:\.[0-9]{1,3}){3}", value['Message'])
    value["host/IP address"] = ips[0] if ips else ""

  • [0] : 'host/IP address': '163.27.187.39'

  • 没有 [0] : 'host/IP address': ['163.27.187.39', '163.27.187.39']

以上是关于如何从字典中的键 "消息 "中提取第一个IP地址,然后用提取的IP地址添加一个名为 "IP "的新键?的主要内容,如果未能解决你的问题,请参考以下文章

python中怎么取出字典的键

如何在 Ocaml 中解决这个字典问题?

python中字典的问题

当 s = "(]" 时,Leetcode 有效括号返回 false?

强类型视图中的错误消息 - 啥是“字典”?

python数据类型之字典