2012-12-08 74 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); 

只是不停地重复对其他变量你需要,并将它们存储在所需的输出中。

相关问题