2013-03-14 2 views
1

Так что я пытаюсь сделать, это функция, которая находит последовательность «ATG» в строке, а затем оттуда перемещается вдоль строки в единицах 3, пока не найдет «TAA», «TAG» »или 'TGA' (ATG-ххх-ххх-ТАА | TAG | TGA)Regex Python findall. Делать вещи непреднамеренными

Чтобы сделать это, я написал эту строку кода (где fdna является входная последовательность)

ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna) 

Я тогда хотел добавить 3 требования:

  1. Общая длина должна быть 30
  2. Два места перед ATG должен быть либо А или G для обнаружения (A | GxxATGxxx)
  3. Следующее место после ATG бы быть G (ATGGxx)

Для выполнить эту часть, я изменил мой код:

ORF_sequence_finder = re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)',fdna) 

то, что я хочу, вместо того, чтобы все эти ограничения будет иметь требование 1 (больше или равно 30 символов), а затем ЯВНО требование 2 (A | GxxATGxxx) ИЛИ требование 3 (ATGGxx) ИЛИ оба из них.

Если я разделяю приведенную выше строку на две части и прилагаю их к списку, они выходят из строя и имеют повторы.

Вот несколько примеров различных случаев:

sequence1 = 'AGCCATGTGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTGAAAA' 
sequence2 = 'ATCCATGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTAG' 
sequence3 = 'AGCCATGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTAG'  
sequence4 = 'ATGGGGTGA' 

sequence1 = 'A**G**CC*ATG*TGGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TGA*AAA' 

sequence1 будут приняты в соответствии с критериями, поскольку она вытекает требование 2 (A | GxxATGxxx), а его длина> = 30.

sequence2 = 'ATCC*ATG***G**GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TAG* 

sequence2 будет acce pted, потому что следует требование 3 (A-T-G-G-х-х), а его длина> = 30

sequence3 = 'A**G**CC*ATG***G**GGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TGA*AAA' 

sequence3 будет принят, поскольку он выполняет как требование 2 и 3, в то же время имеющую> = 30 символа.

sequence4 = 'ATGGGGTGA' 

sequence4 НЕ будет принят, потому что его не> = 30, не соответствует требованиям 2 или требование 3.

Так в основном, я хочу, чтобы принять последовательности, либо следуют требования 2 И/ИЛИ требование 3 (или оба) при удовлетворении требования 1.

Как я могу разделить это, не добавляя дубликатов (в случаях, когда они происходят) и выходят из строя?

+0

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

+0

Должен ли '[AG] ..' подсчитываться по длине или только строка, начинающаяся с 'ATG', должна быть'> = 30'? – Qtax

+0

только ATG. , , TGA | TAA | TAG должен быть включен в 30. то, что я делал раньше, состояло в том, что последовательность включала [AG ..], а затем использовала цикл for позже для последовательности [3:], чтобы обрезать первые несколько, но я не смог бы сделать это с теми, которые включали только [ATGG-xxx] –

ответ

1

Если возможно [AG].. должны быть включены в требовании длины вы можете использовать:

r'(?x) (?: [AG].. ATG | ATG G..) (?:...){7,}? (?:TAA|TAG|TGA)' 

Или, если вы не хотите включать [AG].. в матче можно использовать lookarounds:

r'(?x) ATG (?: (?<=[AG].. ATG) | (?=G)) (?:...){8,}? (?:TAA|TAG|TGA)' 
+0

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

+0

@ draconisthe0ry: прокрутите страницу вниз, чтобы увидеть их объяснение: http: // regex101 .com/r/bR9sK1 и http://regex101.com/r/uC2lJ7 Для получения дополнительной информации о конструкциях проверьте ссылку на regex, например [perlre] (http://perldoc.perl.org/perlre.html). – Qtax

+0

, если вы должны были сделать переменную из длины (т. Е. Позицию 7). , , как бы вы это сделали? Я показал свои попытки здесь http://stackoverflow.com/questions/22673739/using-format-to-use-variable-in-regex-findall-object-python –

 Смежные вопросы

  • Нет связанных вопросов^_^