2016-11-01 55 views
0

所以我有這個命名righthops.txt文本文件,其中包含了一堆線,所有看起來像:蟒紋與正則表達式匹配

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命令只提取每行中的最後一個時間延遲(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喇叭推薦:

由換行符分割的文本文件,然後使用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])