gpt4 book ai didi

python - 如何使用 RegEx 加速 Apache 日志的解析以扩展 Pandas 数据框?

转载 作者:行者123 更新时间:2023-11-30 22:28:21 25 4
gpt4 key购买 nike

我正在编写一个脚本,它将大(400mb)的 apache 日志文件解析到 pandas 表中。

我的旧笔记本电脑用该脚本解析 apache 日志文件大约需要 2 分钟。现在我想知道是否不能更快?

apache日志文件结构是这样的:Ip - - [时间戳] “GET …方法” http-status-code 字节 “地址” “useragent”例如:

93.185.11.11 - - [13/Aug/2016:05:34:12 +0200] "GET /v1/con?from=…" 200 575 "http://google.com" "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0"

我的代码使用正则表达式 findall。我还测试了匹配和搜索方法。但他们似乎更慢。

 reg_dic = {
"ip" : r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b',
"timestamp" : r'\[\d+\/\w+\/\d+\:\d+\:\d+\:\d+\s\+\d+\]',
"method" : r'"(.*?)"',
"httpstatus" : r'\s\d{1,3}\s',
"bytes_" : r'\s\d+\s\"',
"adress" : r'\d\s\"(.*?)"',
"useragent" : r'\"\s\"(.*?)"'
}

for name, reg in reg_dic.items() :
item_list = []
with open ( file ) as f_obj:
for line in f_obj :
item = re.findall( reg , line)
item = item[0]
if name == "bytes_" :
item = item.replace("\"", "")
item = item.strip()
item_list.append( item )
df[ name ] = item_list
del item_list

最佳答案

您可以使用extract expand 参数为 true,以便根据提取的数据返回数据帧。希望对您有帮助

示例 df

df = pd.DataFrame({"log":['93.185.11.11 - - [13/Aug/2016:05:34:12 
+0200] "GET /v1/con?from=…" 200 575 "http://google.com" "Mozilla/5.0
(Windows NT 6.2; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0"',

'93.185.11.11 - - [13/Aug/2016:05:34:12 +0200] "GET /v1/con?from=…"
200 575 "http://google.com" "Mozilla/5.0 (Windows NT 6.2; WOW64;
rv:54.0) Gecko/20100101 Firefox/54.0"',

'93.185.11.11 - - [13/Aug/2016:05:34:12 +0200] "GET /v1/con?from=…"
200 575 "http://google.com" "Mozilla/5.0 (Windows NT 6.2; WOW64;
rv:54.0) Gecko/20100101 Firefox/54.0"']})

这是基于@Wiktor Stribiżew的正则表达式改进

ws = '^(?P<ip>[\d.]+)(?:\s+\S+){2}\s+\[(?P<timestamp>[\w:/\s+]+)\]\s+"(?P<method>[^"]+)"\s+(?P<httpstatus>\d+)\s+(?P<bytes>\d+)\s+(?P<adress>"[^"]+")\s+(?P<useragent>"[^"]+")$'

new = df['log'].str.extract(ws,expand=True)

输出:

             ip                   timestamp              method httpstatus  \0  93.185.11.11  13/Aug/2016:05:34:12 +0200  GET /v1/con?from=…        200   1  93.185.11.11  13/Aug/2016:05:34:12 +0200  GET /v1/con?from=…        200   2  93.185.11.11  13/Aug/2016:05:34:12 +0200  GET /v1/con?from=…        200     bytes               adress  \0   575  "http://google.com"   1   575  "http://google.com"   2   575  "http://google.com"                                              useragent  0  "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:54.0) ...  1  "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:54.0) ...  2  "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:54.0) ...  

关于python - 如何使用 RegEx 加速 Apache 日志的解析以扩展 Pandas 数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46620093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com