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

标签 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.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;']

在树格式中,如下所示:

enter image description here

我正在尝试编写一些代码来查看列表项并返回 ID (BMNHxxxxxx),这些 ID 由分支长度 0(例如 <0.001)连接(以红色突出显示)。我考虑过使用正则表达式,例如:

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 将是 ':',因为分支长度总是出现在 a : 之后,而项目 B 将是 ',' 或 ')' 或 ';'因为这些有三个字符来分隔它,但我在正则表达式方面没有足够的经验来做到这一点。

在这种情况下,通过使用 0 的分支长度,我希望代码输出 ['BMNH703458a', 'BMNH703458b']。如果我可以将其更改为还包括由用户定义值的分支长度连接的 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/

相关文章:

python - 如何通过 Paramiko 获取广播消息

python - setattr() 和 object.__setattr__() 有什么区别?

python - Django 1.6.5 中不存在该列

c - 使用 C 代码难以读取 DNA 序列文件

c++ - 使用多维数组分析 RNA 序列

java - 比较多个子串

python - HDF5 可能的数据损坏或丢失?

php - 替换分号 (;),但不替换 html 字符(等)

regex - FluentD 日期时间格式不匹配

java - 在 Java 中使用 REGEX 分割字符串