从文本文件中的ping输出解析浮点数

时间:2016-10-03 22:10:00

标签: python regex ping text-parsing

所以我正在编写这个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命令,以确保它将它们识别为数字将有很大帮助!谢谢!

2 个答案:

答案 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]