2016-11-01 3 views
0

Так что я этот текстовый файл с именем righthops.txt, который содержит кучу строк, которые все похожи:Python Pattern Matching с Regex

12 engrish.net (216.70.106.32) 19.491 ms 22.252 ms 22.147 ms 
12 engrish.net (216.70.106.32) 15.214 ms 19.502 ms 37.143 ms 
12 engrish.net (216.70.106.32) 15.832 ms 15.804 ms 15.738 ms 

Так что я этот код, который открывает текстовый файл и считывает его в Затем я пытаюсь использовать команду findall команды regex для извлечения только последней временной задержки в каждой строке (22.147, 37.143, 15.738). Я не хотел слишком усложняться, поэтому планировал выполнить совпадение с шаблоном, чтобы получить последние два временных задержек в каждой строке, и позже я мог бы использовать цикл for, чтобы взять все остальные элементы в списке в новый список с только последними задержками времени.

Чтобы сделать это, я попытался сделать шаблон в виде любых цифр, следующих за «мс», которые теоретически будут принимать за последние два временных задержек в каждой строке, но по какой-то причине мой код (показано ниже) не принимает во всем. Любая помощь будет принята с благодарностью!

hops = open('righthops.txt') 
righthops = hops.read() 
alldelays = re.findall(r'ms (\d+\.\d+)', righthops) 
+1

Похоже между столбцами больше одного места. – Biffen

+2

Почему бы вам просто не перебирать строку в строке, а совпадать с '\ d + \. \ D + (? = \ S * ms \ s * $)' и делать с ней все, что вам нравится? –

ответ

1

Если все ваши файлы отформатированы одинаково, то регулярное выражение, вероятно, будет излишним. В этом случае гораздо проще просто идти по индексации на split()

with open("righthops.txt", 'r') as hops: 
    for line in hops: 
     last_delay = line.split()[-2] 

Вы, очевидно, придется изменить выше, чтобы сохранить каждую задержку независимо от структуры данных вы хотите. Также обратите внимание, что я использовал диспетчер контекста with как удобную вещь (избегает необходимости hops.close())

Если файл особенно велик, вы хотите сделать линейный подход, чтобы предотвратить весь файл хранится в памяти (что ваш текущий подход с re.findall() делает)

0

Разделить на пробелы, взять второй на последний элемент.

d = """12 engrish.net (216.70.106.32) 19.491 ms 22.252 ms 22.147 ms 
12 engrish.net (216.70.106.32) 15.214 ms 19.502 ms 37.143 ms 
2 engrish.net (216.70.106.32) 15.832 ms 15.804 ms 15.738 ms 
""" 

for l in d.split("\n"): 
    if " " in l: 
     print(l.split()[-2]) 

Выход

22.147 
37.143 
15.738 
0

Подобно тому, что рекомендуется @Lutz Horn:

Разделите текстовый файл с новой строки, а затем использовать re.findall следующим образом:

collector = [] 
y = '''12 engrish.net (216.70.106.32) 19.491 ms 22.252 ms 22.147  ms 
12 engrish.net (216.70.106.32) 15.214 ms 19.502 ms 37.143 ms 
12 engrish.net (216.70.106.32) 15.832 ms 15.804 ms 15.738 ms''' 


for line in y.split("\n"): 
    x = re.findall(r"(\d{2}.\d{3} ms\s*)", line) 
    collector.append(x[-1]) 

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

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