Python正则分组解析日志为字典列表时代码无返回值求助
日志解析代码问题排查与修正
代码存在的具体问题
- 测试字符串语法错误:原代码中定义
l1时用双引号包裹字符串,字符串内部请求字段的双引号未做转义,直接截断了字符串结构,触发Python语法错误,代码无法正常启动运行。 - 正则语法断裂:原代码编写正则时被换行打断,将命名分组
?P<time>拆分为带换行的? \nP<time>、?P<request>拆分为带换行的? \nP<request>,搭配re.VERBOSE参数使用时,正则内的换行、无意义空白会被直接忽略,导致两个分组语法完全失效,无法正常匹配内容。 - 返回值类型错误:循环内直接将
re.finditer返回的正则匹配对象追加到结果列表,没有提取匹配对象的groupdict()内容,即便匹配成功,返回的也不是要求的字典结构列表,而是匹配对象集合。 - 测试逻辑错位:代码开头定义了测试日志字符串
l1,但logs()函数内直接读取本地logdata.txt文件,未将测试用日志作为解析输入,测试时会因文件缺失或内容不匹配无法得到预期结果。
修正后可直接运行的代码
import re l1 = """146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622 197.109.77.178 - kertzmann3129 [21/Jun/2019:15:45:25 -0700] "DELETE /virtual/solutions/target/web+services HTTP/2.0" 203 26554""" def logs(): logs1 = [] # 完整连续的正则表达式,避免换行打断分组语法 pattern = r'(?P<host>(?:\d+\.){3}\d+) - (?P<user_name>[\w-]+) \[(?P<time>[^\]]+)\] "(?P<request>[^"]+)"' for item in re.finditer(pattern, l1): # 提取匹配结果的字典结构追加到列表 logs1.append(item.groupdict()) return logs1 # 调用验证 print(len(logs())) print(logs())
预期输出效果
运行代码后将得到长度为2的字典列表,元素结构完全匹配示例要求:
[
{"host":"146.204.224.152", "user_name":"feest6811", "time":"21/Jun/2019:15:45:24 -0700", "request":"POST /incentivize HTTP/1.1"},
{"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"}
]
内容的提问来源于stack exchange,提问作者Sudipta Banerjee
相关产品推荐
相关产品推荐

