正则匹配指定字符串后提取后续3位字符:如何从访问日志提取HTTP状态码
问题原因
- 正则未使用捕获组:
re.findall()匹配无捕获组的正则时,会返回完整匹配的字符串,而非你需要的状态码片段。 .*属于贪婪匹配规则,会尽可能多的向后匹配字符,可能会命中日志行靠后的三位数字段,导致匹配结果偏离预期。- 行尾符号
$无效是因为HTTP状态码不属于行尾元素,其后还跟随了响应字节数、UA标识等内容,$只能匹配整行的结束位置,无法适配当前场景。 - 额外的细节问题:正则里的
HTTP/1.1中的.没有转义,正则中.默认匹配任意字符,存在误匹配风险。
修正后的实现代码
import re with open("access.log", "r", encoding="utf-8") as file: contents = file.read() # 用捕获组仅提取三位状态码,转义小数点保证匹配精准 http_codes = re.findall(r'HTTP/1\.1"\s+(\d{3})', contents) print(http_codes)
可选优化
如果日志中存在HTTP/2.0等其他版本的请求,可以调整正则兼容所有HTTP版本:
http_codes = re.findall(r'HTTP/\d\.\d"\s+(\d{3})', contents)
内容的提问来源于stack exchange,提问作者Randson
相关产品推荐
相关产品推荐

