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

Python中re.match().groups()解析Apache日志匹配失败的问题求助

问题分析与解决

错误根源

  1. 正则匹配位置完全错误:你想要过滤的是referer字段(日志中倒数第三个带引号的内容),但却错误地修改了请求行的匹配规则(日志中第一个带引号的内容,格式是GET /xxx HTTP/1.1)。请求行根本不会以http://开头,导致正则完全匹配失败,re.match()返回None。
  2. 未处理匹配失败的情况:当re.match()找不到匹配时会返回None,直接调用groups()必然触发AttributeError,因为None没有这个方法。

解决方法

步骤1:修正正则规则

将过滤规则放到referer对应的匹配组中,也就是把原本匹配referer的([^\"]+)替换为(http://[a-zA-Z].*),确保只匹配以http://+字母开头的referer。

步骤2:添加匹配结果判断

在调用groups()前,先检查matched_line是否为None,避免报错。

修正后的代码示例

import re

# 修正后的正则:仅匹配符合要求的referer
CUSTOM_LOG_PATTERN = '- - \[.*?\] "(.*)" (\d{3}) (.*) "(http://[a-zA-Z].*)" "(.*?)" (.*)'

# 符合要求的日志行
valid_log = '- - [01/Feb/2017:00:00:00 +0200] "GET /aikakausi/binding/1145113/image/14 HTTP/1.1" 200 658925 "http://digi.kansalliskirjasto.fi/aikakausi/binding/1145113?page=14&term=HOIKKA" "Mozilla/5.0 (Linux; Android 5.1.1; SM-J320FN Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/49.0.2623.105 Mobile Safari/537.36 [FB_IAB/MESSENGER;FBAV/100.0.0.29.61;]" 569'

# 不符合要求的日志行(referer为IP开头)
invalid_log = '- - [01/Feb/2017:12:34:51 +0200] "GET /aikakausi/binding/499213?page=55 HTTP/1.1" 401 1612 "http://192.168.8.1/html/home.html?url&address=http://digi.kansalliskirjasto.fi/aikakausi/binding/499213?page=55" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" 1995'

cleaned_lines = []

# 处理符合要求的日志
matched_line = re.match(CUSTOM_LOG_PATTERN, valid_log)
if matched_line:
    l = matched_line.groups()
    cleaned_lines.append({
        "client_request_line":  l[0],
        "status":               l[1],
        "bytes_sent":           l[2],
        "referer":              l[3],
        "user_agent":           l[4],
        "session_id":           l[5],
    })
    print("处理成功的日志:", cleaned_lines)
else:
    print("当前日志不符合规则,跳过")

# 处理不符合要求的日志
matched_line = re.match(CUSTOM_LOG_PATTERN, invalid_log)
if matched_line:
    print(matched_line.groups())
else:
    print("当前日志的referer不符合规则,跳过")

可选优化:兼容不符合规则的日志

如果希望保留其他字段,仅过滤异常referer,可以将referer的匹配组改为可选:

# 允许referer为空或不符合规则,匹配后再判断
CUSTOM_LOG_PATTERN = '- - \[.*?\] "(.*)" (\d{3}) (.*) "(http://[a-zA-Z].*)?" "(.*?)" (.*)'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:01:30