5

以下のように、Newick Format で記述されたツリーである 1 つの項目で構成される Python のリストがあります。

['(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 (BMNHxxxxxx) は枝の長さ 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 は「,」または「)」または「;」のいずれかになります。これらはそれを区切る3文字ですが、正規表現でこれを行うのに十分な経験がありません。

この場合、分岐長 0 を使用することで、コードに ['BMNH703458a', 'BMNH703458b'] を出力させたいと考えています。これを変更して、たとえば 0.01 のユーザー定義値のブランチ長で結合された ID も含めることができれば、非常に便利です。

誰かが意見を持っているか、有用な答えを教えてくれるなら、私はそれを高く評価します.

4

3 に答える 3

2

さて、これは数字のみを抽出する正規表現です(小数の可能性があります):

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

sは\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']
于 2014-04-19T17:21:37.440 に答える