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

Python正则表达式提取日志请求内容时如何去除引号

解决日志提取中request字段去引号问题

问题描述

我通过以下代码读取日志文件内容:

with open("assets/logdata.txt", "r") as file:
    logdata = file.read()

日志文件中重复出现如下格式的条目:

197.109.77.178 - kertzmann3129 [21/Jun/2019:15:45:25 -0700] "DELETE /virtual/solutions/target/web+services HTTP/2.0"

我用正则表达式提取字段,代码如下:

import re  # 补充原代码遗漏的导入

pattern = """
(?P<host>\d*\.\d*\.\d*\.\d*)
(\s-\s)
(?P<user_name>\w*\d*|-)
(\s\[) 
(?P<time>\d*/\w*/\d*:\d*:\d*:\d*\s-\d*)
(]\s)
(?P<request>".*")

"""

cleanWebLog = list()
for i in re.finditer(pattern, logdata, re.VERBOSE):
    cleanWebLog.append(i.groupdict())

输出结果中request字段包含了首尾的引号(显示为&quot;是转义后的效果):

[{'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"'}]

需要让request字段仅保留引号内的内容,去掉引号。

解决方案

方案1:修改正则表达式(推荐)

直接调整正则的request捕获组,只捕获引号内的内容,把引号作为非捕获的边界:

pattern = """
(?P<host>\d*\.\d*\.\d*\.\d*)
(\s-\s)
(?P<user_name>\w*\d*|-)
(\s\[) 
(?P<time>\d*/\w*/\d*:\d*:\d*:\d*\s-\d*)
(]\s")  # 匹配开头的引号,不捕获
(?P<request>[^"]*)  # 捕获所有非引号字符,即引号内的内容
(")  # 匹配结尾的引号,不捕获
"""

这样提取的request字段直接就是不带引号的内容,无需后续处理。

方案2:提取后处理字段

如果不想修改正则,可以在生成字典时对request字段做清洗:

cleanWebLog = list()
for i in re.finditer(pattern, logdata, re.VERBOSE):
    item = i.groupdict()
    # 去除首尾的双引号;如果是HTML转义的&quote;,替换为item['request'].replace('&quot;', '')
    item['request'] = item['request'].strip('"')
    cleanWebLog.append(item)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:57:33