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字段包含了首尾的引号(显示为"是转义后的效果):
[{'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转义的"e;,替换为item['request'].replace('"', '') item['request'] = item['request'].strip('"') cleanWebLog.append(item)
内容的提问来源于stack exchange,提问作者ajeddi1
相关产品推荐
相关产品推荐

