Регулярное выражение для соответствия определенному шаблону, только если это не соответствует другому шаблону - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно создать соответствующее регулярное выражение, чтобы найти генетические последовательности, и я застрял за одной конкретной проблемой - после первого запуска кодона ATG, также следует другие кодоны из трех нуклеотидов, и регулярное выражение заканчивается тремя возможными кодонами TAA, TAG и TGA. Что если стоп-кодон (end) идет после стартового (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

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

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

При использовании (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 будет считаться конечной группой.

Демо .

0 голосов
/ 25 апреля 2019

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

$seq =~ /((AGGAGG)([ACGT]{4,12})(ATG)([ACGT]{3})*?(TAA|TAG|TGA))/igx
0 голосов
/ 11 апреля 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;
...