在 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 所提到的,在大多数情况下,如果数据结构良好,则使用正则表达式并不是一个好主意。请注意使用给定数据结构的库。
我知道关于多个定界符的问题有多个答案,但我的问题涉及需要用多个定界符而不是所有定界符来定界。我有一个包含以下内容的文件:
((((((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 所提到的,在大多数情况下,如果数据结构良好,则使用正则表达式并不是一个好主意。请注意使用给定数据结构的库。