

例えば、以下のようなタンパク質、つまり20種類のアミノ酸（文字）からなる任意長の配列を考えます。

[code]

    MNIFEMLRIDELRLKIYKDTEYYTIIHLLTKSPSLNAAKSELDKAIRNTNVITKDEAEKLFNQDVDAAVRILRNAKLKPVYD
    
[/code]

実は、タンパク質の配列中には、任意長のアミノ酸配列からなる特定のパターンが含まれることがあります。このパターンはモチーフと呼ばれ、正規表現で与えられます。以下はその一例です（実際には1000以上あります）。

[code]

    N[^P][ST][^P]
    [RK]{2}.[ST]
    [ST].[RK]
    [ST].{2}[DE]
    .G[RK][RK]
    C.[DN].{4}[FY].C.C
    RGD
    
[/code]

ここで上記のタンパク質を、元のアミノ酸のみの配列から、モチーフにあたる部分は上記の正規表現に変換し、モチーフではない部分は元のアミノ酸のままで表現したいです。ただし、なるべく元のタンパク質の長さが短くなるように表現したいです。

このようなことを実現するためには、Pythonでどのようなコードを書けば良いでしょうか？  
よろしくお願いします。


CC BY-SA 3.0
2016-12-17T12:34:08.177
31205
2017-03-01T04:47:18.380
2016-12-17T12:40:13.040
12874
12874
question
python 正規表現
配列を正規表現に置き換えて表現したい


正規表現がマッチしたところをその正規表現自体で変換したい、という理解で間違いなければ、

[code]

    import re
    
    motifs = ['N[^P][ST][^P]',
              '[RK]{2}.[ST]',
              '[ST].[RK]',
              '[ST].{2}[DE]',
              '.G[RK][RK]',
              'C.[DN].{4}[FY].C.C',
              'RGD']
    
    amino = "MNIFEMLRIDELRLKIYKDTEYYTIIHLLTKSPSLNAAKSELDKAIRNTNVITKDEAEKLFNQDVDAAVRILRNAKLKPVYD"
    for motif in motifs:
        amino = re.sub(motif, motif, amino)
    print(amino)
    # MNIFEMLRIDELRLKIYKDTEYYTIIHLLTKSPSLNAAK[ST].{2}[DE]KAIRNTNVI[ST].{2}[DE]AEKLFNQDVDAAVRILRNAKLKPVYD
    
[/code]

でいけるはずです。

与えられた例だと、マッチするモチーフは一つしかなく、文字列が短くなるわけでもないですが。。。


CC BY-SA 3.0
2016-12-17T15:24:14.167
31208
2016-12-17T15:24:14.167
19944
31205
answer