从ping返回中过滤掉不需要的数据

时间:2018-09-17 21:24:12

标签: python python-3.x ping

我正在尝试对Google DNS进行ping操作,以获取Internet连接的延迟,然后将其通过COM端口发送到带有花哨的灯光和一些头的arduino中,因此我不必在Tab进入CMD提示符时每隔几分钟。问题是下面的代码要么没有过滤掉所需的信息,要么就白白地拒绝了工作,而我却不了解编程知识,这已经成为了很大的挑战。

import subprocess
import re

ping = subprocess.Popen(["ping", "8.8.8.8", "-n", "1"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True)
output = ping.communicate()

pattern = r"time= (\d+\S+)"
re.findall(pattern, output[0].decode('utf-8'))[0]
print(output)

输出为:

IndexError: list index out of range

但是如果我改变

pattern = r"time= \d+\S+)"

pattern = r"Average = \d+\S+)"

输出变为:

(b'\r\nPinging 8.8.8.8 with 32 bytes of data:\r\nReply from 8.8.8.8: bytes=32 time=26ms TTL=122\r\n\r\nPing statistics for 8.8.8.8:\r\n    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n    Minimum = 26ms, Maximum = 26ms, Average = 26ms\r\n', b'')

它可对Google DNS进行ping操作,但不会过滤出所需部分的20ms,理想情况下,输出为20(不包含ms)。

我的小脑袋哪里出了错吗?谢谢:)

2 个答案:

答案 0 :(得分:0)

我想类似下面的内容可以为您提供帮助:

import re

m = re.search(r'time=(\d+)ms', output[0].decode('utf-8'))
if m:
    print(m.group(1))

另外,您可能希望将结果强制转换为int,即

if m:
    latency = int(m.group(1))

(不会更改输出,但是现在您可以处理数字,而不再是字符串)。

问题在于等号之前的空格字符(=)。由于您提供的字符串中没有任何内容,因此您的正则表达式失败。

答案 1 :(得分:0)

将您的正则表达式模式更改为r'\btime=\s*(\d+)'