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'])
【讨论】:
哪个文件?您只指定了输入文本。如果该文本在文件中,您应该先阅读它。 使用这两行,您将需要两个模块:re
和 datetime
【参考方案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?