2014-04-19 2 views
4

나는 아래 Newick 형식으로 작성된 나무이며, 하나 개의 항목으로 구성된 파이썬에서 목록이 :이 아래와 같이 나타납니다사용 파이썬은 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

나는 목록 항목을 통해보고 0 (또는 < 예를 들어 0.001)의 지점 길이에 의해 결합되어있는 ID를 (BMNHxxxxxx가) (빨간색으로 강조 표시) 반환 코드를 작성하는 것을 시도하고있다. 내가 같은 정규식을 사용하는 방법에 대한 생각 :

항목 A가 될 다른 StackOverflow의 답변에서 가져온으로
JustTree = [] 
with JustTree as f: 
    for match in re.finditer(r"(?<=Item\sA)(?:(?!Item\sB).){50,}", subject, re.I): 
     f.extend(match.group()+"\n") 

':'분기 길이가 항상 후 나타나는 : 및 항목 B는이 될 것이다 ','나 ')'또는 ';' 이 세 문자로 그것을 구분하지만, Im은 이것을 수행하는 정규 표현식에서 충분히 경험하지 못했습니다.

이 경우 분기 길이 0을 사용하면 [ 'BMNH703458a', 'BMNH703458b'] 코드를 출력하고 싶습니다. 만약 ID가 0.01의 사용자 정의 값의 브랜치 길이에 의해 합쳐 지도록 이것을 포함하도록 변경하면 매우 유용 할 것입니다.

누군가 입력이 있거나 유용한 답변을 제공 할 수 있다면 매우 감사하겠습니다.

\b[0-9]+(?:\.[0-9]+)?\b 

\b의이 다른 숫자, 글자가 없음을 확인 또는 오른쪽 옆에 숫자 주위에 밑줄 :

+0

그러나 나에게이 두 ID는 '0'의 브랜치 길이로 결합되지 않고 '0'의 브랜치 길이로 결합됩니다.00000328449424529074'. 당신이 중요하지 않다고 생각하는 정도의 정도가 있습니까? – Jerry

+0

@ 제리 사과, 아픈 내 질문을 편집, 예, 나는 0.00000328449424529074가 0에서 크게 차이가 없었습니다 – PaulBarr

+0

이 특정 예제에서는 작동하지 않지만 모든 예제에서 작동합니다. 그래서 newick 형식을 설명하기 위해 우리는 A, B, C라는 세 종의 나무를 가지고 있다고 말합니다. A와 B는 C보다 더 관련이 있습니다. 업로드 된 트리에서 빨간색 강조 표시된 지점 바로 위에있는 세 종을 직접 보았습니다. 내말은. Newick 체재에서 이것은 ((A, B), C)로 쓰여질 것입니다. 가지 길이를 포함 시키려면 ':'다음에 길이를 추가하십시오. 따라서이 예에서 예제가 작동하는 동안 변수 0 \ .000을 늘리면 밀접하게 연관된 ID를 조합하기 시작합니다. – PaulBarr

답변

2

좋아, 여기에 (잠재적 인 소수 포함) 숫자 만 추출하는 정규식입니다. 단어 경계라고합니다.

[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'] 
+0

정규 표현식을'r "\ b [\ d.] +"'로 단순화 할 수 있습니다. 문자열을 float으로 변환 할 수 있습니다 :'branch_lengths = [branch_lengths의 x에 대해 float (x)]' – ooga

+0

단순화가 항상 더 나은 것은 아닙니다. 그 정규식은 또한 많은 점과 일치 할 것이고'\ d'가 영어 숫자 외에 다른 문자와도 일치 할 것입니다. – Jerry

+0

Jerry에게 도움이되고 싶습니다. :) – ooga

2

나는 당신의 질문에 대한 답변이되었습니다 알고, 그러나 데이터를 평면 문자열 대신 중첩 목록으로 사용하려는 경우 :

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) 
2

ar e newick 형식을 지원하는 여러 Python 라이브러리.

from ete2 import Tree 
tree = Tree(newickFile) 
print tree 

여러 newick 서브 포맷 그들이 과학적 표기법으로 표현하는 경우에도 choosen 및 지점의 거리를 구문 분석 할 수 있습니다 다음 ETE toolkit는 newick 문자열을 읽고 파이썬은 객체로 나무와 함께 작동 할 수 있습니다.

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