如何编写正则表达式从日志文件提取匹配分组,获取全部所需指定字段
你原有正则无法匹配全字段的核心原因是没有适配日志的格式特征:时间字段被方括号包裹、包含大量非单词字符,请求字段被双引号包裹,你原有规则均未做适配。调整后的正则如下:
pattern = r""" (?P<host>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) # 匹配IP格式的host \ -\ (?P<user>\w+) # 匹配用户名 \ \[ (?P<date>[^\]]+) # 匹配方括号内的所有日期内容,直到遇到闭合方括号 \]\ " (?P<req>[^"]+) # 匹配双引号内的所有请求内容,直到遇到闭合双引号 \" """
使用时需要开启re.VERBOSE模式忽略正则中的空格和注释,完整调用示例:
import re # 你的日志样例 log_line = '219.133.7.154 - price5585 [21/Jun/2019:15:45:53 -0700] "GET /incubate/incubate HTTP/1.1" 201 12126' match_obj = re.match(pattern, log_line, re.VERBOSE) if match_obj: # 按要求格式输出 res = "{host: %s, user: %s, date: %s, req: %s}" % ( match_obj.group("host"), match_obj.group("user"), match_obj.group("date"), match_obj.group("req") ) print(res)
运行后即可输出你需要的格式结果。
内容的提问来源于stack exchange,提问作者Olga Wold
相关产品推荐
相关产品推荐

