2012-12-08 104 views
3

我有一個很大的文本文件,我只想提取某些短語/單詞之後的數字。在文本文件中抽取特定單詞後的數字

有在以下格式這個巨大的文本文件,幾十行:

Best CV Model for car: 15778 is order:2 threshold: 0 with AUC of : 0.7185 gene aau_roc: 0.466281

一種解決辦法是隻看數量後,「汽車:X」,「是爲了:X」,「門檻:X「,」Y gene aau_roc:X「!

最後,我想每行有15778,2,0,0.7185,0.466281。

回答

4
>>> if line.startswith('Best CV Model'): 
...  re.findall(r'\d+\.{0,1}\d*', line) 
... 
['15778', '2', '0', '0.7185', '0.466281'] 
+0

這種模式肯定比我想出的模式簡單,但它的缺點是它會匹配與提問者所尋找的行結構不匹配的行上的數字。 – Blckknght

+0

@Blckknght在理論上你的解決方案可能是更完美的解決方案,在現實生活中,採取'較柔和'的解決方案通常是明智的,因此也解析了可能存在拼寫錯誤的行,如'threhsold'而不是'threashold'。我會在這裏使用這個解決方案。 – erikbwork

2

由於您已將問題標記爲regex,我懷疑您已經接近解決方案。你可以編寫一個正則表達式模式來匹配你所在行上的所有數字。喜歡的東西:

pattern = r"for car: (\d+) is order:(\d+) threshold: (\d+) with AUC of : ([0-9.]+) gene aau_roc: ([0-9.]+)" 

注意,我做了這正是你的例子字符串匹配,包括周圍的:字符一些奇怪的間距在幾個地方。仔細檢查它是否與你的真實數據一起工作。

要使用此做一個搜索文本文件中,我會使用re.finditer搜索在整個文本,並返回一個迭代:

import re 

for model, order, threshold, auc, aau_roc in re.finditer(pattern, text): 
    do_stuff() 
+0

是的,我想使用正則表達式,使用re.finditer給我下面的錯誤!回溯(最近一次調用最後一次): 文件「logparser.py」,第10行,在 re.finditer(pattern,head) 文件「/usr/lib/python2.6/re.py」,第186行,在finditer 返回_compile(模式,標誌).finditer(字符串) TypeError:預期的字符串或緩衝區 – user702846

+0

和我的代碼是這樣的與開放(「test.log」)作爲myfile: head = list(islice(myfile, 100)) 對於汽車模式= r「:(\ d +)爲:(\ d +)閾值:(\ d +)AUC爲([0-9。] +)基因aau_roc:([0-9 。] +)「 re.finditer(模式,頭) 打印模型 – user702846

+0

@ user702846啊,如果你正在閱讀文件到行列表中,你想要一個differen t搜索代碼。我假設你把整個文本放在一個字符串中。試一下'matches = [re.search(pattern,line)for line in head]'或者那個效果。 – Blckknght

0
re.match('(?<=for car:)/n*',the_line); 

只是不停地重複對其他變量你需要,並將它們存儲在所需的輸出中。

相關問題