首页 > 解决方案 > 使用 RegEx 逐行遍历日志文件以查找 IP 地址模式。每个 IP 都需要使用 extend 方法将每个 ip 添加到列表 IPS

问题描述

我正在编写一个脚本并尝试使用正则表达式逐行遍历日志文件以查找 IP 地址模式,然后使用扩展方法将每个 ip 添加到列表 ips 中。正如您在脚本中看到的那样,我相信在迭代之前我已经做好了一切,然后尝试打印(ips)。

    import urllib.request
    import json
    import datetime
    import os
    import re 
    import azuremaps

我创建了 3 个空列表来存储找到的数据

     ips = []
     unique_ips = []
     toJson = []

我打开的日志文件 file = open('logs/access.log', 'r')

这可能是我搞砸了尝试使用正则表达式逐行遍历日志文件以获取 ip 地址,然后使用扩展方法将它们存储在列表 ips 中的地方。希望此代码少于 5 行。

    pattern = re.compiler(r'(\d{1,3}\.\d{1,3}\.\d{1,3} \.\d{1,3})')
    for line in file:
    ips.extend(pattern.search(line)[0])
    print(ips)

新列表填充删除所有重复。

    unique_ips = list(set(ips))

在我继续之前,我需要验证我的列表,但是当我在终端中键入 print(ips) 时,我得到 bash:syntax error near unexpected token 'ips'

    #print(ips)
    #print(len(ips))
    #print(len(unique_ips))
    #print(unique_ips)

标签: pythonregex

解决方案


有什么理由逐行进行吗?

假设 access.log 文件为:

43.53.250.2
65.66.66.69
noise234.85.98.12something
whatever65.66.66.69

我想你可以试试这个:

import re

with open('logs/access.log', 'r') as file:
    file = file.read()

pattern = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
ips = pattern.findall(file)
unique_ips = list(set(ips))

print(unique_ips)
['234.85.98.12', '65.66.66.69', '43.53.250.2']

关于您的代码的注释:

  • 我相信它应该是 re.compile 而不是 re.compiler
  • 看起来你的正则表达式字符串中有一个额外的空间
  • 我认为您可以使用append,因为无论如何您一次尝试extend使用一个元素来列出您的列表。

推荐阅读