所以我正在编写这个python程序,它必须从包含大量ping的文本文件中提取往返时间,我在下面预览的文本文件中是什么:
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=12.6ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=1864ms
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=107.8ms
我想从文本文件中提取的是12.6,1864和107.8。我使用正则表达式执行此操作并具有以下内容:
import re
ping = open("pingoutput.txt")
rawping = ping.read()
roundtriptimes = re.findall(r'times=(\d+.\d+)', rawping)
roundtriptimes.sort()
print (roundtriptimes)
我遇到的问题是,我认为这些数字被作为字符串读入到roundtriptimes列表中,因此当我对它们进行排序时,它们并不像我希望的那样排序。
任何想法如何修改我的正则表达式findall命令,以确保它将它们识别为数字将有很大帮助!谢谢!
答案 0 :(得分:1)
我不知道如何在RegEx中执行此操作,但如果您在排序之前添加以下行,则应该为您处理:
roundtriptimes[:] = [float(x) for x in roundtriptimes]
答案 1 :(得分:1)
只需在空间上执行拆分,抓取最后一个条目,然后在=
上拆分,抓住列表的第二部分并省略最后两个组件(ms)。投射到浮子。
所有这些都是在列表理解中完成的:
请注意,readlines
用于包含包含文件每一行的列表,这将更容易管理。
with open('ping_results.txt') as f:
data = f.readlines()
times = [float(line.split()[-1].split('=')[1][:-2]) for line in data]
print(times) # [12.6, 1864.0, 107.8]
关键是要注意正在使用的正则表达式:
time=(\d*\.?\d+)
查找time=
,然后启动捕获组()
,并抓取数字(\d*
),可选小数(\.?
),数字(\d+
)。
import re
with open('ping_results.txt') as f:
data = f.readlines()
times = [float(re.findall('time=(\d*\.?\d+)', line)[0]) for line in data]
print(times) # [12.6, 1864.0, 107.8]