我在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;']
树状显示如下:
我正在尝试编写一些代码,以遍历列表项并返回ID(BMNHxxxxxx),这些ID由分支长度0(例如
JustTree = []
with JustTree as f:
for match in re.finditer(r"(?<=Item\sA)(?:(?!Item\sB).){50,}", subject, re.I):
f.extend(match.group()+"\n")
从另一个StackOverflow答案中获取,其中项目A将是“:”,因为分支长度总是出现在:之后,而项目B将是“,”或“)”或“;”因为这些字符限制了它的三个字符,但是我在正则表达式中经验不足,无法做到这一点。
通过在这种情况下使用0的分支长度,我希望代码输出['BMNH703458a','BMNH703458b']。如果我可以将其更改为还包括ID,并且ID由用户定义值的分支长度(例如0.01)连接,则将非常有用。
如果有人有任何意见,或者可以给我指出一个有用的答案,我将不胜感激。
最佳答案
好的,这是一个仅提取数字(带有可能的小数)的正则表达式:
\b[0-9]+(?:\.[0-9]+)?\b
\b
确保在其旁边的数字周围没有其他数字,字母或下划线。这称为单词边界。[0-9]+
匹配多个数字。(?:\.[0-9]+)?
是一个可选组,表示它可能匹配,也可能不匹配。如果在第一个[0-9]+
后面有一个点和数字,则它将匹配这些点和数字。否则,不会。该组本身匹配一个点和至少1位数字。您可以将其与
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']
关于python - 使用Python从Newick格式提取分支长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23172293/