2016-10-03 14 views
-3

Так что я пишу эту питона программу, которая должна извлечь круглое время поездки из текстового файла, который содержит многочисленные звоны, что там в текстовом файле я просматриваемый ниже:Синтаксического число с плавающим от выхода пинга в текстовом файле

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 как строки, так, когда я иду, чтобы отсортировать их, они не сортировать как я бы хотел.

Любая идея, как изменить мою команду поиска regex, чтобы убедиться, что она распознает их, поскольку числа будут очень полезны! Благодаря!

+0

Перекрестная писал: http://unix.stackexchange.com/questions/314093/parsing-text-file-in-python/314095#314095http://unix.stackexchange.com/questions/314093/ parsing-text-file-in-python/314095 # 314095 Я уже отвечаю вам, даже с ** полным рабочим ** кодом python ... –

+0

@GillesQuenot Я только что увидел это после отправки ответа. Это очень неудачно. На самом деле в вашем ответе есть полностью функциональное решение Python (и на самом деле это регулярное выражение, которое лучше моего). – idjaw

ответ

1

Я не знаю способ сделать это в RegEx, но если добавить следующую строку перед родом, он должен заботиться о нем для вас:

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

Non-регулярное выражение:

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

Все, что делается в списке-понимания:

Обратите внимание, что 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] 
+0

, который дает мне индекс IndexError: индекс за пределами диапазона –

+0

@SZapata Я сделал небольшое обновление для своего регулярного выражения (однако он все еще работал со старым регулярным выражением). Однако, используя ваши данные образца в файле и скопируйте мой код. Все отлично работает для меня. – idjaw

 Смежные вопросы

  • Нет связанных вопросов^_^