Как предотвратить перекрытие при поиске кодонов ДНК - PullRequest
0 голосов
/ 07 мая 2020

Я новичок в этом. Я использую регулярное выражение в python, чтобы попытаться найти определенные кодоны c во вмененной последовательности ДНК. В настоящее время код работает, но не замечает перекрытия (т.е. если последняя буква кодона перед ним - A, а следующие две буквы - A и C, он найдет кодон WR C, который не т действительно существуют). Есть ли способ изменить это?

import re
while True:
    DNA = input("enter the DNA sequence:")
    print('WRC:')
    wrcpattern = re.compile(r'(A|T)(A|G)C')
    wrcmatches = wrcpattern.finditer(DNA)
    for match in wrcmatches:
        print(match)
    print('SYC:')
    sycpattern = re.compile(r'(C|G)(C|T)C')
    sycmatches = sycpattern.finditer(DNA)
    for match in sycmatches:
        print(match)
    print('')

Изменить: я также пытался добавить это, чтобы разбить его на кодоны

x = 3
res=[DNA[y-x:y] for y in range(x, len(DNA)+x,x)]
DNA = res

Но это возвращает ошибку, я думаю, что он не может использовать набор разделенных строк, например это.

1 Ответ

0 голосов
/ 17 мая 2020

Наборы кодонов

Учитывая входную последовательность букв, вы хотите интерпретировать ее как последовательность кодонов, и они ищут небольшой набор определенных c кодонов. Наборы Python отлично подходят для ответа на этот тип вопросов. Например, для проверки WR C одно решение:

wrcset = set(['AAC', 'TAC', 'AGC', 'TGC'])
for codon in (DNA[i:i+3] for i in range(0,len(DNA),3)):
  if codon in wrcset:
    print(codon)

RE

Если вы хотите использовать регулярное выражение, вы можете использовать нежадное повторение 3- длинные заголовки символов, чтобы пропустить несовпадающие кодоны и затем сопоставить желаемое выражение. Соответствия, возвращаемые итератором, будут иметь как пропущенные, так и целевые кодоны в разных группах захвата (или вы можете сделать первую группу захвата не захватывающей). Например, совпадение SY C может быть записано как

for i in re.compile('(.{3})*?((C|G)(C|T)C)').finditer(DNA):
  print(i.group(2))
...