使用 re 从 txt 文件制作字典

Ahm*_*har 5 python regex

考虑 assets/logdata.txt 中的标准 Web 日志文件。该文件记录了用户在访问网页时进行的访问(就像这个!)。日志的每一行都有以下项目:

  • 主机(例如,'146.204.224.152'
  • 一个'feest6811'用户名(例如,注意:有时缺少用户名!在这种情况下,使用“-”作为用户名的值。)
  • 发出请求的时间(例如,'21/Jun/2019:15:45:24 -0700'
  • post 请求类型(例如,'POST /incentivize HTTP/1.1'注意:并非所有内容都是 POST!)

您的任务是将其转换为字典列表,其中每个字典如下所示:

example_dict = {"host":"146.204.224.152", 
                "user_name":"feest6811", 
                "time":"21/Jun/2019:15:45:24 -0700",
                "request":"POST /incentivize HTTP/1.1"}
Run Code Online (Sandbox Code Playgroud)

这是 txt 数据文件的示例。

文本文件示例

我写了这几行代码:

import re
def logs():
    with open("assets/logdata.txt", "r") as file:
        logdata = file.read()
        #print(logdata)
        pattern="""
        (?P<host>.*)        
        (-\s)   
        (?P<user_name>\w*)  
        (\s) 
        ([POST]*)
        (?P<time>\w*)               
                 """
        for item in re.finditer(pattern,logdata,re.VERBOSE):
            print(item.groupdict())
        return(item)
logs()
Run Code Online (Sandbox Code Playgroud)

它帮助我进行了制作"host""user_name"但是我无法继续完成其余的要求。有人可以帮忙吗? 这就是我迄今为止所做的

小智 5

试试这个我的朋友

import re


def logs():
    logs = []
    w = '(?P<host>(?:\d+\.){3}\d+)\s+(?:\S+)\s+(?P<user_name>\S+)\s+\[(?P<time>[-+\w\s:/]+)\]\s+"(?P<request>.+?.+?)"'
    with open("assets/logdata.txt", "r") as f:
        logdata = f.read()
    for m in re.finditer(w, logdata):
        logs.append(m.groupdict())
    return logs
Run Code Online (Sandbox Code Playgroud)


n1c*_*s.m 1

您正在使用\wget user_names,但\w不包括-可以在日志中的内容(通用日志格式(CLF)),因此您可以使用\S+(除空格之外的一个或多个任何内容)作为替代方案。对于time您可以创建一个捕获组,仅允许该字段的预期字符(类)(例如\w\s-+时区、/日期和:时间)用方括号(文字)括起来,可以为request使用"

import re

regex = re.compile(
    r'(?P<host>(?:\d+\.){3}\d+)\s+'
    r'(?:\S+)\s+'
    r'(?P<user_name>\S+)\s+'
    r'\[(?P<time>[-+\w\s:/]+)\]\s+'
    r'"(?P<request>POST.+?)"'
)

def logs():
    data = []
    with open("sample.txt", "r") as f:
        logdata = f.read()
    for m in regex.finditer(logdata):
        data.append(m.groupdict())
    return data

print(logs())
Run Code Online (Sandbox Code Playgroud)

将第一行的 user_name 替换为“-”以在第二行进行测试

[
   {
      "host":"146.204.224.152",
      "user_name":"feest6811",
      "time":"21/Jun/2019:15:45:24 -0700",
      "request":"POST /incentivize HTTP/l.l"
   },
   {
      "host":"146.204.224.152",
      "user_name":"-",
      "time":"21/Jun/2019:15:45:24 -0700",
      "request":"POST /incentivize HTTP/l.l"
   },
   {
      "host":"144.23.247.108",
      "user_name":"auer7552",
      "time":"21/Jun/2019:15:45:35 -0700",
      "request":"POST /extensible/infrastructures/one-to-one/enterprise HTTP/l.l"
   },
    ...
Run Code Online (Sandbox Code Playgroud)