Я не думаю, что регулярное выражение достаточно выразительно, чтобы справиться с этим требованием длины.
Однако, вы можете сломать эту проблему с помощью окна итератора для имитации открытой рамки считывания:
# From http://stackoverflow.com/questions/6822725/rolling-or-sliding-window-iterator-in-python:
from itertools import islice
def window(seq, n=2):
"Returns a sliding window (of width n) over data from the iterable"
" s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
sequence = "ATG GTC TGA CGA CGG CAG TAA AAA AAA GGG TGG GCA GCC TTT GAA GCC TTT"
codons = sequence.split()
orf = window(codons, 7)
matching_codons = ['TGA', 'TAA', 'TAG']
[sequence for sequence in orf if any(codon in matching_codons for codon in sequence)]
рассекает код
orf = window(codons, 7)
Это определяет генератор, который будет возвращать каждый кадр длины 7, перемещая кадр на 1 каждую итерацию.
После этого переименование итераций выполняет две вещи.
Он перебирает каждую последовательность в нашем ORF:
[sequence for sequence in orf] # returns all possible frames of length 7 in sequence
Он фильтрует результат, возвращает только последовательности, которые содержат любой из допустимых кодонов:
[sequence for sequence in orf if any(codon in ['TGA', 'TAA', 'TAG'] for codon in sequence)] # Only matches sequences matching 'TGA', 'TAA', or 'TAG'
И наконец , Если вы хотите, чтобы результат будет подстрок сами, используйте следующий список comprension:
[' '.join(sequence) for sequence in window(codons, 7) if any(codon in ['TGA', 'TAA', 'TAG'] for codon in sequence)]
Результат:
['ATG GTC TGA CGA CGG CAG TAA', 'GTC TGA CGA CGG CAG TAA AAA', 'TGA CGA CGG CAG TAA AAA AAA', 'CGA CGG CAG TAA AAA AAA GGG', 'CGG CAG TAA AAA AAA GGG TGG', 'CAG TAA AAA AAA GGG TGG GCA', 'TAA AAA AAA GGG TGG GCA GCC']
Чтобы уточнить, что вы ищете '' TAG', TGA 'и' TAA' в любой семи последовательности кодонов? – timolawl
Итак, чтобы уточнить, не совпадают ли совпадения? Таким образом, последовательность 'ATG GTC TGA CGA CGG CAG TAA AAA AAA' должна возвращать совпадения' ATG GTC TGA CGA CGG CAG TAA', 'GTC TGA CGA CGG CAG TAA AAA' и' TGA CGA CGG CAG TAA AAA AAA'? –
А почему 19 или 20-мер? Не было бы ли количество пар оснований, не делящихся на 3, неполной последовательностью? –