Регулярное выражение для сопоставления определенного шаблона, только если он не соответствует другому шаблону

Мне нужно создать соответствующее регулярное выражение, чтобы найти генетические последовательности, и я застрял в одной конкретной проблеме - сначала начальный кодон ATG, а также другие кодоны из трех нуклеотидов, а регулярное выражение заканчивается тремя возможными кодонами TAA, TAG и TGA. Что делать, если стоп-кодон (конец) идет после стартового кодона (ATG)? Мое текущее регулярное выражение работает, когда между стартовым и стоп-кодоном есть промежуточные кодоны, но если их нет, регулярное выражение соответствует ВСЕЙ последовательности после стартового кодона. Я знаю, почему он это делает, но я понятия не имею, как изменить его, чтобы он работал так, как я хочу.

Мое регулярное выражение должно искать AGGAGG (именно этот шаблон), затем A, C, G или T (от 4 до 12 раз), затем ATG (именно этот шаблон), затем A, C, G или T (в тройках (например, ACG, TGC и т. д.), не имеет значения, как долго) ДО тех пор, пока оно не совпадет с TAA, TAG или TGA. Поиск должен закончиться после этого и начаться снова после этого.

Пример хорошего совпадения:

XXXXXXXXXXXXXXXXXXXXXXXXX   XXXXXXXXXXXXXXXX
AGGAGGTATGATGCGTACGGGCTAGTAGAGGAGGTATGATGTAGTAGCATGCT

В последовательности два совпадения — от 0 до 25 и от 28 до 44.

Мое текущее регулярное выражение (не обращайте внимания на первые две скобки):

$seq =~ /(AGGAGG)([ACGT]{4,12})(ATG)([ACTG]{3,3}){0,}(TAA|TAG|TGA)/ig

person Kamilė Vainiūtė    schedule 11.04.2019    source источник
comment
Сначала небольшой совет: вместо {3,3} вы можете использовать только {3}, а вместо {0,} вы можете использовать *, и вы говорите, что это соответствует всей последовательности, это проблема, что именно вы делаете хотите чтобы совпало?   -  person AleksW    schedule 11.04.2019
comment
Вы должны будете предоставить нам пример данных. Большинство людей здесь — разработчики программного обеспечения, а не биологи. Значение ваших данных, скорее всего, не имеет для нас смысла и не имеет значения для решения вашей проблемы. Пожалуйста, отредактируйте свой вопрос, включив некоторые последовательности генов и показав, какие биты вы хотите сопоставить. Спасибо.   -  person simbabque    schedule 11.04.2019
comment
@simbabque Я отредактировал свой вопрос, надеюсь, он станет понятнее.   -  person Kamilė Vainiūtė    schedule 11.04.2019
comment
Согласно шаблону, который вы дали, у вас могут быть перекрывающиеся совпадения. Хотите найти все совпадения?   -  person ikegami    schedule 11.04.2019


Ответы (3)


Проблема здесь возникает из-за использования по умолчанию жадных квантификаторов.

При использовании (AGGAGG)([ACGT]{4,12})(ATG)([ACTG]{3})*(TAA|TAG|TGA) 4-я группа ([ACTG]{3})* будет соответствовать как можно большему количеству, тогда будет учитываться только 5-я группа (при необходимости выполняется возврат).
В вашей последовательности вы получите TAGTAG. Жадный квантификатор приведет к тому, что первый TAG будет захвачен в группе 4, а второй захвачен как конечная группа.

Вместо этого вы можете использовать ленивый квантификатор: (AGGAGG)([ACGT]{4,12})(ATG)([ACTG]{3})*?(TAA|TAG|TGA) (обратите внимание на добавленный вопросительный знак, делающий квантификатор ленивым).
Таким образом, первая встреченная TAG будет считаться конечной группой.

Демо.

person PJProudhon    schedule 11.04.2019

Согласно шаблону, который вы дали, у вас могут быть перекрывающиеся совпадения. Следующее найдет все совпадения, включая перекрывающиеся совпадения:

local our @matches;
$seq =~ /
   (
   ( AGGAGG )
   ( [ACGT]{4,12} )
   ( ATG )
   ( (?: (?! TAA|TAG|TGA ) [ACTG]{3} )* )
   ( TAA|TAG|TGA )
   )
   (?{ push @matches, [ $-[1], $1, $2, $3, $4, $5, $6 ] })
   (?!)
/xg;
person ikegami    schedule 11.04.2019

Существенной особенностью регулярных выражений Perl, в отличие от простых регулярных выражений, таких как grep, является ленивый квантификатор: после квантификатора * или +. он соответствует нулю (одному) или более вхождению символа, предшествующего токену * (+), как кратчайшее возможное совпадение

$seq =~ /((AGGAGG)([ACGT]{4,12})(ATG)([ACGT]{3})*?(TAA|TAG|TGA))/igx
person Community    schedule 25.04.2019