You need to enable JavaScript to run this app. Python正则分组解析日志为字典列表时代码无返回值求助
优惠活动
大模型
产品
解决方案
定价
更多

Python正则分组解析日志为字典列表时代码无返回值求助

日志解析代码问题排查与修正

代码存在的具体问题

  • 测试字符串语法错误:原代码中定义l1时用双引号包裹字符串,字符串内部请求字段的双引号未做转义,直接截断了字符串结构,触发Python语法错误,代码无法正常启动运行。
  • 正则语法断裂:原代码编写正则时被换行打断,将命名分组?P<time>拆分为带换行的? \nP<time>、?P<request>拆分为带换行的? \nP<request>,搭配re.VERBOSE参数使用时,正则内的换行、无意义空白会被直接忽略,导致两个分组语法完全失效,无法正常匹配内容。
  • 返回值类型错误:循环内直接将re.finditer返回的正则匹配对象追加到结果列表,没有提取匹配对象的groupdict()内容,即便匹配成功,返回的也不是要求的字典结构列表,而是匹配对象集合。
  • 测试逻辑错位:代码开头定义了测试日志字符串l1,但logs()函数内直接读取本地logdata.txt文件,未将测试用日志作为解析输入,测试时会因文件缺失或内容不匹配无法得到预期结果。

修正后可直接运行的代码

import re

l1 = """146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622
197.109.77.178 - kertzmann3129 [21/Jun/2019:15:45:25 -0700] "DELETE /virtual/solutions/target/web+services HTTP/2.0" 203 26554"""

def logs():
    logs1 = []
    # 完整连续的正则表达式,避免换行打断分组语法
    pattern = r'(?P<host>(?:\d+\.){3}\d+) - (?P<user_name>[\w-]+) \[(?P<time>[^\]]+)\] "(?P<request>[^"]+)"'
    for item in re.finditer(pattern, l1):
        # 提取匹配结果的字典结构追加到列表
        logs1.append(item.groupdict())
    return logs1

# 调用验证
print(len(logs()))
print(logs())

预期输出效果

运行代码后将得到长度为2的字典列表,元素结构完全匹配示例要求:

[
{"host":"146.204.224.152", "user_name":"feest6811", "time":"21/Jun/2019:15:45:24 -0700", "request":"POST /incentivize HTTP/1.1"},
{"host":"197.109.77.178", "user_name":"kertzmann3129", "time":"21/Jun/2019:15:45:25 -0700", "request":"DELETE /virtual/solutions/target/web+services HTTP/2.0"}
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 12:15:03