2016-10-03 73 views
-3

所以我寫這個的Python程序,必須從包含衆多坪的文本文件,什麼在文本文件中我下面預覽提取往返時間:解析浮在文本文件中的ping輸出數量

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列表作爲字符串,所以當我去整理他們,他們不排序。因爲我希望他們。

任何想法如何修改我的正則表達式findall命令,以確保它將它們識別爲數字將極大地幫助!謝謝!

+0

交叉貼:http://unix.stackexchange.com/questions/314093/parsing-text-file-in-python/314095#314095http://unix.stackexchange.com/questions/314093/解析文本文件的蟒蛇/ 314095#314095我已經回答了你,即使**完整工作** python代碼... –

+0

@GillesQuenot我剛剛發佈了答案後看到了這一點。這非常不幸。事實上,你的答案中有一個功能完整的Python解決方案(實際上是一個比我的更好的正則表達式)。 – idjaw

回答

1

我不知道的方式做到這一點的正則表達式,但如果你的排序前添加以下行,應該照顧它給你:

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

非正則表達式:

只需在空間上進行分割,抓取最後一個條目,然後拆分=,抓住列表的第二部分並省略最後兩個分量(ms)。投到浮動。

所有這一切都在一個列表理解來完成:

注意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