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

Parsing floating number from ping output in text file

所以我正在编写这个 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)

我遇到的问题是,我认为这些数字是作为字符串读入往返时间列表的,所以当我对它们进行排序时,它们并没有按照我希望的那样排序。

如果知道如何修改我的正则表达式 findall 命令以确保它将它们识别为数字,将会有很大帮助!谢谢!

我不知道在 RegEx 中有什么方法可以做到这一点,但是如果您在排序之前添加以下行,它应该会为您处理:

roundtriptimes[:] = [float(x) for x in roundtriptimes]

非正则表达式:

简单地在 space 上执行拆分,获取最后一个条目,然后在 = 上拆分,获取列表的第二部分并省略最后两个组件 (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]