2013-10-02 1 views
0

Я пытаюсь сделать код в python, который, учитывая регулярное выражение из данного алфавита, будет предлагать все возможные альтернативы с одинаковыми степенями свободы. Например, если мой алфавит является ACTG (ДНК-нуклеотидами), а мое регулярное выражение - [AG] CG (регулярное выражение, которое охватывает ACG или GCG), я хотел бы вывести [AC] CG (регулярное выражение, которое охватывает ACG или CCG), [AT] CG (регулярное выражение, которое охватывает ACG или TCG), [AG] CC и т. Д.Создание всех возможных комбинаций с аналогичными степенями свободы

Проблема в том, что я очень новичок в python или в программировании вообще и до сих пор не понял способ сделать это. Конечная цель состоит в том, чтобы определить, есть ли определенное отклонение к вырожденной последовательности (регулярное выражение) в данной строке (транскрипт ДНК), если посмотреть, действительно ли среднее значение появления всех других аналогичных последовательностей дегенита меньше, чем число появлений этой специфической вырожденной последовательности. не

Спасибо за любую помощь или подсказку,

Eyal

+0

Смотрите этот вопрос: http://stackoverflow.com/questions/492716/reversing-a-regular-expression-in-python –

+0

Как насчет '[AG] * CG'? Как вы собираетесь справляться с RegExs, которые имеют бесконечные возможные совпадения? Использование генератора? – Hbcdev

ответ

0

Спасибо за комментарии, мне удалось сделать это вручную для конкретного RegEx сейчас (пока я улучшить свои навыки питона), используя этот код (для регулярное выражение [AGT] [AG] AC [ACT]):

import itertools 


def create_pots(): 
    af = [] 
    bf = [] 
    cf = [] 
    df = [] 
    ef = [] 
    gf = [] 
    a = list(itertools.combinations('AGCT', 3)) 
    b = list(itertools.combinations('AGCT', 2)) 
    c = list(itertools.combinations('AGCT', 1)) 
    d = list(itertools.combinations('AGCT', 1)) 
    e = list(itertools.combinations('AGCT', 3)) 
    for i in range(len(a)): 
     af.append('['+ ''.join(a[(i-1)]) + ']') 
    for i in range(len(b)): 
     bf.append('['+''.join(b[(i-1)])+']') 
    for i in range(len(c)): 
     cf.append(''.join(c[(i-1)])) 
    for i in range(len(d)): 
     df.append(''.join(d[(i-1)])) 
    for i in range(len(e)): 
     ef.append('['+''.join(e[(i-1)])+']') 
    g = list(itertools.product(af, bf, cf, df, ef)) 
    for i in range(len(g)): 
     gf.append(''.join(g[(i-1)])) 
    gf.remove('[AGT][AG]AC[ACT]') 
    return gf 

Это возвращает список всех возможных RegExs подобных помоему нравится:

gf = ['[ACT][GT]CC[ACT]', '[GCT][CT]TT[GCT]', '[GCT][CT]TT[AGC]', '[GCT][CT]TT[AGT]', '[GCT][CT]TT[ACT]', '[GCT][CT]TA[GCT]', '[GCT][CT]TA[AGC]', '[GCT][CT]TA[AGT]', '[GCT][CT]TA[ACT]', '[GCT][CT]TG[GCT]', '[GCT][CT]TG[AGC]', '[GCT][CT]TG[AGT]'....]