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

Posted

技术标签:

【中文标题】Python:如何解析和检查时间?【英文标题】:Python: how to Parse and check the time? 【发布时间】:2017-05-09 14:51:31 【问题描述】:

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

以下情况:

241.7118.197.10

28.252.8

【问题讨论】:

【参考方案1】:

第一步是解析数据,你可以这样做:

data = [(ip, datetime.strptime(time, '%d/%b/%Y:%H:%M:%S:%f')) for (ip, time) in re.findall("((?:[0-9]1,3\.)3[0-9]1,3).+?\[(.+?) -", text)]

其中text 是输入文本。

这将返回一个包含每个条目的元组的列表。元组的第一个元素是 IP 地址,第二个是日期。

下一步是查看哪些在 1 秒间隔内发生并且具有相同的 ip:

print set([a[0] for a in data for b in data for c in data if (datetime.timedelta(seconds=0)<a[1]-b[1]<datetime.timedelta(seconds=1)) and (datetime.timedelta(seconds=0)<a[1]-c[1]<datetime.timedelta(seconds=1)) and (datetime.timedelta(seconds=0)<b[1]-c[1]<datetime.timedelta(seconds=1))])

输出:

set(['28.252.89.140'])

【讨论】:

哪个文件?您只指定了输入文本。如果该文本在文件中,您应该先阅读它。 使用这两行,您将需要两个模块:redatetime【参考方案2】:

您可以将数据收集到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'

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

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

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

【讨论】:

所以每个dic[ ip_addr] 都包含一个队列? 是的,deque 的时间戳,每次添加新时间戳时可能会删除最旧的项目。 @Maria 添加了 regex101 的解释和链接。 @niemmi 不错的解决方案。我会像使用THRESHOLD 一样添加一个变量,其中出现的次数作为常量。 @Fomalhaut 感谢您的建议,相应地更新了答案。

以上是关于Python:如何解析和检查时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中检查字符串是不是是有效的 JSON?

如何检查python函数是否更改(在实时代码中)?

如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证

如何检查日期是否已通过Python传递(简单)

如何检查域名解析是否生效?

解析xml时如何检查空标签?