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

使用正则表达式解析日志文件并存储至Pandas DataFrame的问题求助

使用正则表达式解析日志文件并存储至Pandas DataFrame的问题求助

看起来你在解析Apache风格的访问日志时遇到了正则匹配的问题,当前的正则只抓到了有问题的IP和不完整的时间戳,我来帮你调整下~

先说说你当前正则的问题

你的正则 (?P<IP>[^-])- -(?P<Timestamp>[^]]+) 存在两个明显的问题:

  • [^-] 只会匹配单个非-的字符,所以才会拿到空格作为IP结果;
  • 时间戳部分没有精准捕获[]内部的内容,还包含了前面的空格和[符号。

针对标准日志的正确正则表达式

你的日志是标准的Apache访问日志格式,我们可以写一个覆盖所有字段的命名捕获组正则,这样能一次性提取所有需要的信息:

log_pattern = r'(?P<IP>\S+) - - \[(?P<Timestamp>[^\]]+)\] "(?P<Request>[^"]+)" (?P<Status_Code>\d{3}) (?P<Bytes_Sent>\d+) "(?P<Referer>[^"]+)" "(?P<User_Agent>[^"]+)"'

我给你拆解下每个捕获组的作用:

  • (?P<IP>\S+):匹配无空格的IP地址(\S代表任意非空白字符,刚好适配IP的格式)
  • (?P<Timestamp>[^\]]+):精准捕获[]内部的时间戳,自动排除前后的[和]
  • (?P<Request>[^"]+):捕获双引号内的完整请求行(比如PROPFIND /mauricio HTTP/1.1)
  • (?P<Status_Code>\d{3}):匹配3位数字的HTTP状态码
  • (?P<Bytes_Sent>\d+):匹配发送的字节数
  • (?P<Referer>[^"]+):捕获Referer字段内容
  • (?P<User_Agent>[^"]+):捕获完整的User-Agent字符串

完整代码:解析日志并转成Pandas DataFrame

把解析逻辑和DataFrame转换整合起来,代码如下:

import re
import pandas as pd

# 编译正则表达式(提升匹配效率)
compiled_pattern = re.compile(r'(?P<IP>\S+) - - \[(?P<Timestamp>[^\]]+)\] "(?P<Request>[^"]+)" (?P<Status_Code>\d{3}) (?P<Bytes_Sent>\d+) "(?P<Referer>[^"]+)" "(?P<User_Agent>[^"]+)"')

# 存储解析结果的列表
log_records = []

# 读取日志文件并逐行解析
with open("access_log_edw.processed", "r") as log_file:
    for line in log_file:
        line = line.strip()
        if not line:  # 跳过空行
            continue
        match_result = compiled_pattern.match(line)
        if match_result:
            # 把匹配到的命名组转为字典,加入列表
            log_records.append(match_result.groupdict())

# 转为DataFrame
log_df = pd.DataFrame(log_records)
print(log_df.head())

测试你的日志样本的效果

用你提供的三条日志测试,解析后的DataFrame会是这样的(示例):

IPTimestampRequestStatus_CodeBytes_SentRefererUser_Agent
190.183.122.21519/Mar/2023:16:17:01 -0300PROPFIND /mauricio HTTP/1.1301162-Microsoft-WebDAV-MiniRedir/10.0.21996
87.236.176.5019/Mar/2023:16:51:24 -0300GET / HTTP/1.1301162-Mozilla/5.0 (compatible; InternetMeasurement/1.0; +https://internet-measurement.com/)
168.119.63.13820/Mar/2023:21:06:34 -0300GET / HTTP/1.1301162-Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

小提示

如果你的日志里存在格式异常的行(比如缺少某些字段),可以在代码里加入异常处理,避免程序中断,比如在match_result判断后加个else分支记录异常行。

备注:内容来源于stack exchange,提问作者Mauricio Goette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:44:50