Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python从Newick格式提取分支长度_Python_Regex_Dna Sequence_Phylogeny - Fatal编程技术网

使用Python从Newick格式提取分支长度

使用Python从Newick格式提取分支长度,python,regex,dna-sequence,phylogeny,Python,Regex,Dna Sequence,Phylogeny,我有一个python列表,由一个以Newick格式编写的树组成,如下所示: ['(BMNH833953:0.16529463651919140688,(((BMNH833883:0.22945757727367316336,(BMNH724182a:0.18028180766761139897,(BMNH724182b:0.21469677818346077913,BMNH724082:0.54350916483644962085):0.00654573856803835914):0.04530

我有一个python列表,由一个以Newick格式编写的树组成,如下所示:

['(BMNH833953:0.16529463651919140688,(((BMNH833883:0.22945757727367316336,(BMNH724182a:0.18028180766761139897,(BMNH724182b:0.21469677818346077913,BMNH724082:0.54350916483644962085):0.00654573856803835914):0.04530853441176059537):0.02416511342888815264,(((BMNH794142:0.21236619242575086042,(BMNH743008:0.13421900772403019819,BMNH724591:0.14957653992840658219):0.02592135486124686958):0.02477670174791116522,BMNH703458a:0.22983459269245612444):0.00000328449424529074,BMNH703458b:0.29776257618061197086):0.09881729077887969892):0.02257522897558370684,BMNH833928:0.21599133163597591945):0.02365043128986757739,BMNH724053:0.16069861523756587274):0.0;']
在树格式中,显示如下:

['(BMNH833953:0.16529463651919140688,(((BMNH833883:0.22945757727367316336,(BMNH724182a:0.18028180766761139897,(BMNH724182b:0.21469677818346077913,BMNH724082:0.54350916483644962085):0.00654573856803835914):0.04530853441176059537):0.02416511342888815264,(((BMNH794142:0.21236619242575086042,(BMNH743008:0.13421900772403019819,BMNH724591:0.14957653992840658219):0.02592135486124686958):0.02477670174791116522,BMNH703458a:0.22983459269245612444):0.00000328449424529074,BMNH703458b:0.29776257618061197086):0.09881729077887969892):0.02257522897558370684,BMNH833928:0.21599133163597591945):0.02365043128986757739,BMNH724053:0.16069861523756587274):0.0;']


我正在尝试编写一些代码,查看列表项并返回ID(BMNHxxxxxx),这些ID由分支长度0(或好的,这里有一个正则表达式,只提取数字(可能是小数):

\b
s确保旁边的数字周围没有其他数字、字母或下划线。它被称为单词边界

[0-9]+
匹配多个数字

(?:\.[0-9]+)?
是一个可选组,这意味着它可能匹配,也可能不匹配。如果在第一个
[0-9]+
之后有一个点和数字,那么它将匹配这些。否则,它将不匹配。组本身匹配一个点,并且至少匹配一个数字

您可以将其与
re.findall
一起使用,将所有匹配项放入列表中:

import re
NewickTree = ['(BMNH833953:0.16529463651919140688,(((BMNH833883:0.22945757727367316336,(BMNH724182a:0.18028180766761139897,(BMNH724182b:0.21469677818346077913,BMNH724082:0.54350916483644962085):0.00654573856803835914):0.04530853441176059537):0.02416511342888815264,(((BMNH794142:0.21236619242575086042,(BMNH743008:0.13421900772403019819,BMNH724591:0.14957653992840658219):0.02592135486124686958):0.02477670174791116522,BMNH703458a:0.22983459269245612444):0.00000328449424529074,BMNH703458b:0.29776257618061197086):0.09881729077887969892):0.02257522897558370684,BMNH833928:0.21599133163597591945):0.02365043128986757739,BMNH724053:0.16069861523756587274):0.0;']

pattern = re.compile(r"\b[0-9]+(?:\.[0-9]+)?\b")

for tree in NewickTree:
    branch_lengths = pattern.findall(tree)
    # Do stuff to the list branch_lengths
    print(branch_lengths)
对于此列表,您可以打印以下内容:

['0.16529463651919140688', '0.22945757727367316336', '0.18028180766761139897',
 '0.21469677818346077913', '0.54350916483644962085', '0.00654573856803835914', 
 '0.04530853441176059537', '0.02416511342888815264', '0.21236619242575086042',
 '0.13421900772403019819', '0.14957653992840658219', '0.02592135486124686958', 
 '0.02477670174791116522', '0.22983459269245612444', '0.00000328449424529074',
 '0.29776257618061197086', '0.09881729077887969892', '0.02257522897558370684',
 '0.21599133163597591945', '0.02365043128986757739', '0.16069861523756587274',
 '0.0']

我知道您的问题已经得到了回答,但如果您希望将数据作为嵌套列表而不是平面字符串,请执行以下操作:

import re
import pprint

a="(BMNH833953:0.16529463651919140688,(((BMNH833883:0.22945757727367316336,(BMNH724182a:0.18028180766761139897,(BMNH724182b:0.21469677818346077913,BMNH724082:0.54350916483644962085):0.00654573856803835914):0.04530853441176059537):0.02416511342888815264,(((BMNH794142:0.21236619242575086042,(BMNH743008:0.13421900772403019819,BMNH724591:0.14957653992840658219):0.02592135486124686958):0.02477670174791116522,BMNH703458a:0.22983459269245612444):0.00000328449424529074,BMNH703458b:0.29776257618061197086):0.09881729077887969892):0.02257522897558370684,BMNH833928:0.21599133163597591945):0.02365043128986757739,BMNH724053:0.16069861523756587274):0.0;"

def tokenize(str):
  for m in re.finditer(r"\(|\)|[\w.:]+", str):
    yield m.group()

def make_nested_list(tok, L=None):
  if L is None: L = []
  while True:
    try: t = tok.next()
    except StopIteration: break
    if   t == "(": L.append(make_nested_list(tok))
    elif t == ")": break
    else:
      i = t.find(":"); assert i != -1
      if i == 0: L.append(float(t[1:]))
      else:      L.append([t[:i], float(t[i+1:])])
  return L

L = make_nested_list(tokenize(a))
pprint.pprint(L)

有几个Python库支持newick格式。允许读取newick字符串并将树作为Python对象进行操作:

from ete2 import Tree
tree = Tree(newickFile)
print tree
可以使用多个newick子表单,并解析分支距离,即使它们是用科学符号表示的

from ete2 import Tree
tree = Tree("(A:3.4, (B:0.15E-10,C:0.0001):1.5E-234);")

但是对我来说,这两个ID不是由代码长度>代码>0 < /代码>所连接的,而是由代码长度>代码0>00000×328449424529074 < /代码>。是否有某种程度的精度,你认为是无关紧要的?@杰瑞道歉,我会编辑我的问题,是的,我假设0.00 000 032444 9424529074与0.这在这个特殊的例子中是有效的,但并不是在所有的例子中都有效。为了解释newick格式,我们有一棵树,有三个物种:a、B和C,其中a和B比C更相关。在我上传的树中,看看红色突出显示的树枝正上方的三个物种,看看我的意思。在newick格式中,这将被写下来作为((A,B),C)。要包含分支长度,请在“:”之后添加长度。因此,当您的示例在本例中起作用时,您可以看到,通过增加变量0\.000,它将开始将不密切相关的ID放在一起。解决此问题的方法是将所有分支长度提取到一个列表中(BranchLst1),将用户定义输入下面的内容添加到另一个列表(SmallBranchLst2)然后将这些分支与原始的Newick树列表进行匹配。我可以做第二位,但我不能制作一个正则表达式,从Newick树列表中提取所有分支长度并将其放入另一个列表谢谢,我感谢你的帮助!是的,相关ID将是相同的,如果这样更容易,我们可以忽略a或b,因为我在为了帮助自己识别应该一起使用的ID。这意味着树中的所有ID都是相同的,它们以BMNH开头,以6个数字结尾。regex可以简化为
r“\b[\d.]+”
。您可以将字符串转换为浮点:
branch\u length=[float(x)表示branch\u length中的x]
简化并不总是意味着更好。正则表达式还将匹配许多点,以及除英文数字以外的任何其他字符。\d只是想提供帮助,Jerry。:)我只是想说为什么这不一定会更好:)转换为浮点是个好主意,但我相信OP可以自己解决这个问题。:)看看是否可以更好地实现下面的嵌套列表例程。我觉得这是肾盂次优的。
from ete2 import Tree
tree = Tree("(A:3.4, (B:0.15E-10,C:0.0001):1.5E-234);")