在 Python 中使用多个但不是所有分隔符拆分文件

Splitting a file with multiple but not all delimiters in 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)

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

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

那么,当需要多个分隔符时,是否有一种方法可以选择使用哪些分隔符以及避免使用哪些分隔符?

如果您设置了正则表达式来捕获想要的部分,则不必按多个分隔符但不是所有分隔符分隔。根据您的定义,您可以使用 ): 之后的每个数字。使用 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 所提到的,在大多数情况下,如果数据结构良好,则使用正则表达式并不是一个好主意。请注意使用给定数据结构的库。