从文本文件中的 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]
所以我正在编写这个 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]