Фильтрация нежелательных данных из ping return - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь пропинговать Google DNS, чтобы получить задержку интернет-соединения, чтобы затем отправить его через COM-порт в Arduino с причудливыми индикаторами и несколькими уловками, поэтому мне не нужно вносить вкладку в приглашение 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, но нене отфильтровывает 20 мс, что является необходимой частью, в идеале было бы иметь значение 20 без мс.

Есть идеи, где моя маленькая голова пошла не так?Спасибо:)

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Измените шаблон регулярного выражения на r'\btime=\s*(\d+)'

0 голосов
/ 18 сентября 2018

Полагаю, вам может помочь что-то вроде следующего:

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))

(который выигралне меняйте вывод, но теперь вы манипулируете числом, а не строкой).

Проблема заключалась в пробеле () перед равным =.Так как в указанной вами строке нет ни одного, вы не смогли выполнить регулярное выражение.

...