Python/Biopython: Как искать эталонную последовательность (строку) в последовательности с пробелами?
Я столкнулся со следующей проблемой и пока не нашел решения:
Я работаю над инструментом для анализа последовательностей, который использует файл со ссылочными последовательностями и пытается найти одну из этих ссылочных последовательностей в тестовой последовательности.
Проблема в том, что тестовая последовательность может содержать пробелы (например: ATG---TCA
). Я хочу, чтобы мой инструмент нашел конкретную контрольную последовательность в качестве подстроки тестовой последовательности, даже если контрольная последовательность прерывается пробелами (-
) в тестовой последовательности.
Например:
одна из моих ссылочных последовательностей:a = TGTAACGAACGG
моя тестовая последовательность:b = ACCT**TGT--CGAA-GG**AGT
(соответствующая часть из ссылочной последовательности выделена жирным шрифтом)
Я думал о регулярных выражениях и пытался разобраться в этом, но если я не ошибаюсь, регулярные выражения работают только наоборот. Поэтому мне нужно будет включить позиции пробелов в качестве регулярных выражений в последовательность ссылок, а затем сопоставить их с последовательностью испытаний. Однако я не знаю позиций, длины и количества пробелов в тестовой последовательности. Моя идея состояла в том, чтобы обменять позиции разрыва (так что все -
) в строке тестовой последовательности в виде регулярных выражений или в специальный символ, обозначающий любой другой символ в ссылочной последовательности. Чем я сравнил бы немодифицированные ссылочные последовательности с моей модифицированной тестовой последовательностью... К сожалению, я не нашел функции в python для поиска строк или типа регулярного выражения, которое могло бы с этим справиться.
Большое спасибо!
2 ответа
Есть хорошие новости и есть плохие новости...
Сначала плохие новости: то, что вы пытаетесь сделать, это не легко, и регулярное выражение на самом деле не способ сделать это. В простом случае регулярное выражение можно заставить работать (возможно), но это будет неэффективно и не будет масштабироваться.
Тем не менее, хорошая новость заключается в том, что это хорошо понимаемая проблема в биоинформатике (например, см. https://en.wikipedia.org/wiki/Sequence_alignment). Еще лучше то, что в Biopython есть инструменты, которые могут вам помочь. Например, http://biopython.org/DIST/docs/api/Bio.pairwise2-module.html
РЕДАКТИРОВАТЬ Из обсуждения ниже, кажется, вы говорите, что "б", вероятно, будет очень длинным, но если предположить, что "а" все еще коротка (12 оснований в вашем примере выше), я думаю, что вы можете решить эту проблему, повторяя каждые 12-мер в "б". Т.е. разделите 'b' на последовательности длиной 12 баз (очевидно, вы получите много!). Затем вы можете легко сравнить две последовательности. Если вы действительно хотите использовать регулярные выражения (и я все же советую вам не делать этого), то вы можете заменить '-' на '.' и сделать простое совпадение. Например
import re
''' a is the reference '''
a = 'TGTAACGAACGG'
''' b is 12-mer taken from the seqence of interest, in reality you'll be doing this test for every possible 12-mer in the sequence'''
b = 'TGT--CGAA-GG'
b = b.replace('-', '.')
r = re.compile(b);
m = r.match(a)
print(m)
Вы могли бы сделать это:
import re
a = 'TGTAACGAACGG'
b = 'ACCTTGT--CGAA-GGAGT'
temp_b = re.sub(r'[\W_]+', '', b) #removes everything that isn't a number or letter
if a in temp_b:
#do something