我正在尝试使用Python中的以下正则表达式解析Apache常见日志格式日志
APACHE_ACCESS_LOG_PATTERN = '^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+)'
我的典型日志格式为
uplherc.upl.com - - [01/Aug/1995:00:00:04 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 401 0
但我的很多网址都包含空格,我如何解析它们:
uplherc.upl.com - - [01/Aug/1995:00:00:04 -0400] "GET /images/ksclogo-medium large .gif HTTP/1.0" 401 0
目前我正在使用此代码解析
match = re.search(APACHE_ACCESS_LOG_PATTERN, logline)
if match is None:
print>>output_file, logline
return
size_field = match.group(9)
if size_field == '-':
size = long(0)
else:
size = long(match.group(9))
return (Access(
ipAddress = match.group(1),
clientIdentd = match.group(2),
userId = match.group(3),
dateTime = parse_apache_time(match.group(4)),
method = match.group(5),
endpoint = match.group(6),
protocol = match.group(7),
responseCode = int(match.group(8)),
contentSize = size
), 1)
谢谢
答案 0 :(得分:0)
因此,如果Apache没有自动编码空格,请尝试以这种方式修改正则表达式:
APACHE_ACCESS_LOG_PATTERN = '^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (.+?) (\S+)" (\d{3}) (\S+)'
答案 1 :(得分:0)
这是一个对我有用的解决方案,用于获取空白。这是一种非贪婪的解决方案,可将双引号之间的所有内容都包括在内,包括空格。
^(\S+) - - \[([\w:\/]+\s[+\-]\d{4})\] "(.*?)" (\d{3}) (\d+)
^^^^