首页 > 解决方案 > 计算 Python 中正则表达式匹配的出现次数

问题描述

我有一个日志检查器,它使用正则表达式从日志文件中的行中查找 IP。我想找到这些行,并计算通过 IP 匹配的相同行的总出现次数

目标是根据事件的 IP 从事件中生成统计信息。例子:

WARNING - 192.168.1.1 TIMING OUT    
WARNING - 192.168.1.5 TIMING OUT    
WARNING - 192.168.1.1 TIMING OUT    
WARNING - 192.168.1.5 TIMING OUT    
WARNING - 192.168.1.1 TIMING OUT    
WARNING - 10.1.1.1 TIMING OUT    
WARNING - 10.72.3.1 TIMING OUT    

192.168.1.1 - 3 EVENTS    
192.168.1.5 - 2 EVENTS    
10.1.1.1 - 1 EVENT    
10.72.3.1 - 1 EVENT

等等等等。我是 python 新手,所以我仍在学习最适合此目的的方法。到目前为止,我打开了日志文件,使用正则表达式模式执行 for 循环以查找每一行中的 IP,但从那里我有点迷失了。干杯。

标签: pythonregexsortingloggingcounting

解决方案


您可以使用re.findall此处捕获所有 IP 地址事件,然后使用映射来计算出现次数:

inp = """WARNING - 192.168.1.1 TIMING OUT    
WARNING - 192.168.1.5 TIMING OUT    
WARNING - 192.168.1.1 TIMING OUT    
WARNING - 192.168.1.5 TIMING OUT    
WARNING - 192.168.1.1 TIMING OUT    
WARNING - 10.1.1.1 TIMING OUT    
WARNING - 10.72.3.1 TIMING OUT"""

matches = re.findall(r'\bWARNING - (\b\d+\.\d+\.\d+\.\d+\b)', inp)
d = {}

for elem in matches:
    try:
        val = d.get(elem) or 0
        d[elem] = val + 1
    except KeyError:
        d[elem] = d[elem]

print(d)

这打印:

{'10.1.1.1': 1, '192.168.1.5': 2, '10.72.3.1': 1, '192.168.1.1': 3}

推荐阅读