计算 Python 中正则表达式匹配项的出现次数
Counting occurrences of Regex Matches in 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,但从那里我有点迷路了。干杯。
你可以在这里使用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}
下面是我在 .
的回答的修改版本
假设日志在文件中,逐行读取。
#!/usr/bin/python
import os
import re
def increment(ips: dict, line: str):
match = re.match(r'^.+?\s+-\s+(?P<ip>\d{1,3}(\.\d{1,3}){3})\s.*$', line)
if match:
ip = match.group('ip')
if not ip in ips:
ips[ip] = 0
ips[ip] += 1
def parse_log_file(log: str) -> dict:
ips = dict()
with open(log, 'r') as file:
for line in file:
increment(ips, line)
return ips
# log is the path to the log file:
for key, value in parse_log_file(log).items():
print(key, ":", value)
我有一个日志检查器,它使用正则表达式从日志文件中的行中查找 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,但从那里我有点迷路了。干杯。
你可以在这里使用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}
下面是我在 .
的回答的修改版本假设日志在文件中,逐行读取。
#!/usr/bin/python
import os
import re
def increment(ips: dict, line: str):
match = re.match(r'^.+?\s+-\s+(?P<ip>\d{1,3}(\.\d{1,3}){3})\s.*$', line)
if match:
ip = match.group('ip')
if not ip in ips:
ips[ip] = 0
ips[ip] += 1
def parse_log_file(log: str) -> dict:
ips = dict()
with open(log, 'r') as file:
for line in file:
increment(ips, line)
return ips
# log is the path to the log file:
for key, value in parse_log_file(log).items():
print(key, ":", value)