簡體   English   中英

在python中使用正則表達式解析網絡日志文件

[英]Parsing web log file using regex in python

我有一個包含數字主機數據和字母數字用戶名數據的網絡日志文件。 以下是日志文件中的幾行:

189.254.43.43 - swift6867 [21/Jun/2019:15:53:00 -0700] "GET /architectures/recontextualize/morph/scale HTTP/1.0" 204 8976
20.80.28.12 - hagenes4423 [21/Jun/2019:15:53:01 -0700] "POST /harness HTTP/1.1" 404 28127
112.211.50.38 - - [21/Jun/2019:15:53:03 -0700] "DELETE /harness/e-business/functionalities HTTP/1.1" 405 7975

有時,用戶名會替換為連字符。

我只想提取第一個方括號之前的數據,然后將其轉換為字典列表。 例如:

example_dict = {"host":"189.254.43.43", 
                "user_name":"swift6867"}

這是我使用的正則表達式:

pattern = """
    (?P<host>[\d]*[.][\d]*[.][\d]*[.][\d]*)     # host dictionary
    (?P<username>([\w]+|-)(?=\ \[))             # username dictionary 
"""

re.finditer(pattern,logdata,re.VERBOSE)

正則表達式找不到任何匹配項。 只有單獨的正則表達式才有效。 我的意思是,如果我注釋掉用戶名字典的正則表達式,主機字典的正則表達式將起作用,反之亦然。

我究竟做錯了什么?

您可以使用下一個正則表達式(演示):

^(?P<host>(?:\d+\.?){4})\s*-\s*(?P<user_name>[^\s-]*?)\s

要創建字典列表,您可以在groupdict()返回的每個Match對象上應用finditer()

import re
...
pattern = r'^(?P<host>(?:\d+\.?){4})\s*-\s*(?P<user_name>[^\s-]*?)\s'
result = [i.groupdict() for i in re.finditer(pattern, logdata, re.MULTILINE)]

這個正則表達式( demo )的步驟少一點,所以在更大的數據上它應該稍微快一點:

^(?P<host>\d+\.\d+\.\d+\.\d+)\s*-\s*(?P<user_name>[^\s-]*?)\s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM