2016-05-17 58 views
2

我知道关于多个分隔符有多个问题的答案,但我的问题涉及需要由多个分隔符分隔但不是全部分隔符。我有一个包含以下文件:在Python中使用多个但不是全部分隔符分割文件

((((((Anopheles_coluzzii:0.002798,Anopheles_arabiensis:0.005701):0.001405,(Anopheles_gambiae:0.002824,Anopheles_quadriannulatus:0.004249):0.002085):0,Anopheles_melas:0.008552):0.003211,Anopheles_merus:0.011152):0.068265,Anopheles_christyi:0.086784):0.023746,Anopheles_epiroticus:0.082921):1.101881; 

这是newick格式,所有的信息都在一个长行。我想要做的是隔离所有跟随另一个数字的数字。例如,我想隔离的第一个数字是0.001405。我想把它放在一个包含数字后面的所有其他数字(不是名称等)的列表中。

我试着用下面的代码:

with open("file.nh", "r") as f: 
    for line in f: 
     data = line 
     z = re.findall(r"[\w']+", data) 

这里的问题是,这种分割使用列表“”以及其他分隔符,这是一个问题,因为我需要的所有数字都有小数点。

我考虑过与此并将列表中的数字转换为整数,然后删除所有非int值和0值。但是,某些文件包含0作为需要保留的值。

那么有没有办法选择使用哪些分隔符,以及在需要多个分隔符时要避免哪些分隔符?

+0

Google“python newick”。问问你自己“有其他人已经做过这件事了吗?”总是很重要的,通常在生活中,但在编程方面尤其如此。 –

+0

嗨,如果它是BioPython你指的是我确实看过整个文档,但我不能推导出如何从它获得我需要的东西,这是提取我的树的内部分支长度。我并不是说它不能在BioPython中完成,因为我确定必须有一种方法,但是没有成功,我决定用python手动解析文件。 – spiral01

+0

隔离所有数字后跟另一个数字......在这种情况下该做什么:'Anopheles_quadriannulatus:0.004249):0.002085):0':你想要0.002085和0还是只是第一个或最后一个? –

回答

2

如果你设置你的正则表达式来捕获想要的部分,没有必要用多个但不是所有的分隔符来分割。根据你的定义,你可以在):之后使用每个数字。使用re模块可能的解决方案是这样的:

with open("file.nh", "r") as f: 
    for line in f: 
     z = re.findall(r"\):([0-9.]+)", line) 
     print(z) 

结果是:

['0.001405', '0.002085', '0', '0.003211', '0.068265', '0.023746', '1.101881'] 

r"\):([0-9.]+)"正在搜索):接着用数字或小数点的一部分。第二部分是结果,因此在括号内。

正如Alex Hall在大多数情况下提到的,如果数据结构良好,使用正则表达式不是一个好主意。小心使用给定数据结构的库。

+0

谢谢,这正是我所需要的。出于兴趣,如果数据结构良好,为什么使用正则表达式不是一个好主意? – spiral01

+0

快速解决方案完全可以。当以下情况之一适用时,这不是一个好主意:1)您正在处理来自不同来源的数据 - 因此拥有一个健壮而灵活的解析器(空格,格式等可能不同)非常重要。2)你正在处理大量的数据(但有些情况下正则表达式仍然是最快的选择......)3)你正在转换数据 - 很难做到基于字符串 –

相关问题