2016-05-15 2 views
0

Я хотел бы сгенерировать шаблон для скрипта python, где в указанном шаблоне должно существовать любое число из трех слов?subpattern filter

, например, дана последовательность:

ATG GTC TGA CGA CGG CAG TAA AAA AAA GGG TGG GCA GCC TTT GAA GCC TTT 

Я хотел бы, чтобы найти все вхождения 19-21mers, которые содержат по крайней мере один из любого из следующих слов: TAG, TGA или TAA

Я попытался указать шаблон = '[A,G,C,T,\s]{21,26}^.*\b(TAT|TGA|CCC)\b.*$'

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

+1

Чтобы уточнить, что вы ищете '' TAG', TGA 'и' TAA' в любой семи последовательности кодонов? – timolawl

+0

Итак, чтобы уточнить, не совпадают ли совпадения? Таким образом, последовательность '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'? –

+0

А почему 19 или 20-мер? Не было бы ли количество пар оснований, не делящихся на 3, неполной последовательностью? –

ответ

0
import re 
string_to_read="ATG GTC TGA CGA CGG CAG TAA AAA AAA GGG TGG GCA GCC TTT GAA GCC TTT" 
res=re.search('(TAT|TGA|TAA)', string_to_read) 
if res: 
    print('matched %s'%res.groups()) 

Это регулярное выражение сообщит вам, существует ли какая-либо из этих 3 последовательностей в тестируемой строке.

Если вам нужно, чтобы соответствовать, что всем 3 существует, вы можете проверить все-независимо

if re.match('TAT', string_to_read) and re.match('TGA', string_to_read) and re.match('TAA', string_to_read): 
    print('has all 3') 

вместо какого-то умного регулярного выражения со всей комбинаторикой этих 3-х последовательностей. Если вы не хотите запускать 3 отдельных регулярных выражения, вы можете сделать что-то с регулярным выражением, например (TAT)|(TGA)|(AAA), а затем сохранить подсчет всех выбранных вами групп, посмотреть, удалили ли вы все из них.

+0

Это не работает с требованием длины, потому что оно будет соответствовать «TAT TGA TAA», которое не является 21-мерным. –

+0

О, я думаю, я не понял эту часть :) Думал, что это было простое совпадение строк :) – djcrabhat

+0

Да, это значительно усложняет ситуацию. Я не уверен, что регулярные выражения достаточно выразительны для требования длины. –

1

Я не думаю, что регулярное выражение достаточно выразительно, чтобы справиться с этим требованием длины.

Однако, вы можете сломать эту проблему с помощью окна итератора для имитации открытой рамки считывания:

# 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 каждую итерацию.

После этого переименование итераций выполняет две вещи.

  1. Он перебирает каждую последовательность в нашем ORF:

    [sequence for sequence in orf] # returns all possible frames of length 7 in sequence

  2. Он фильтрует результат, возвращает только последовательности, которые содержат любой из допустимых кодонов:

    [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'] 
Смежные вопросы