gpt4 book ai didi

Python:如何解析和检查时间?

转载 作者:太空狗 更新时间:2023-10-29 20:58:01 24 4
gpt4 key购买 nike

如何提取一秒内出现10次的IP地址?

在以下情况下:

241.7118.197.10

28.252.8

最佳答案

您可以将数据收集到 dict,其中 IP 是键,值包含给定 IP 的时间戳。然后每次添加时间戳时,您都可以检查给定 IP 是否在一秒钟内具有三个时间戳:

from datetime import datetime, timedelta
from collections import defaultdict, deque
import re

THRESHOLD = timedelta(seconds=1)
COUNT = 3

res = set()
d = defaultdict(deque)

with open('test.txt') as f:
for line in f:
# Capture IP and timestamp
m = re.match(r'(\S*)[^\[]*\[(\S*)', line)
ip, dt = m.groups()

# Parse timestamp
dt = datetime.strptime(dt, '%d/%b/%Y:%H:%M:%S:%f')

# Remove timestamps from deque if they are older than threshold
que = d[ip]
while que and (dt - que[0]) > THRESHOLD:
que.popleft()

# Add timestamp, update result if there's 3 or more items
que.append(dt)
if len(que) >= COUNT:
res.add(ip)

print(res)

结果:

{'28.252.89.140'}

上面逐行读取包含日志的日志文件。对于每一行,正则表达式用于捕获两组数据:IP 和时间戳。那么strptime用于解析时间。

第一组 (\S*) 捕获除空白以外的所有内容。然后 [^\[]* 捕获除了 [\[ 捕获时间戳之前的最后一个字符之外的所有内容。最后 (\S*) 再次用于捕获所有内容,直到下一个空格。参见 example on regex101 .

一旦我们有了 IP 和时间,它们就会被添加到 defaultdict其中 IP 用作键,值为 deque的时间戳。在添加新时间戳之前,如果旧时间戳早于 THRESHOLD,则会将其删除。这假设日志行已经按时间排序。添加后检查长度,如果队列中有 COUNT 个或更多项,则将 IP 添加到结果集中。

关于Python:如何解析和检查时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309232/

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