正则表达式仅在不匹配其他模式时才匹配特定模式

时间:2019-04-11 09:30:11

标签: regex perl genetic-algorithm genetics

我需要创建一个匹配的正则表达式来查找遗传序列,但遇到一个特定问题-首先,启动密码子ATG,也跟随来自三个核苷酸的其他密码子,并且正则表达式以三个可能的密码子结尾TAATAGTGA。如果终止密码子位于起始密码子{ATG之后,该怎么办?当起始密码子和终止密码子之间存在中间密码子时,我当前的正则表达式将起作用,但是如果没有中间密码子,则正则表达式将匹配起始密码子后的所有序列。我知道为什么会这样做,但是我不知道如何将其更改为我想要的方式。

我的正则表达式应查找AGGAGG(正是这种模式),然后查找ACGT(从4到12倍)然后是ATG(正是这种模式),然后是ACGT(三元组(例如ACG,{ {1}}等),无论多长时间,直到它与TGCTAATAG匹配为止。搜索应在此之后结束,然后再开始。

匹配的示例:

TGA

序列中有两个匹配项-从0到25,从28到44。

我当前的正则表达式(不要介意前两个括号)

XXXXXXXXXXXXXXXXXXXXXXXXX   XXXXXXXXXXXXXXXX
AGGAGGTATGATGCGTACGGGCTAGTAGAGGAGGTATGATGTAGTAGCATGCT

3 个答案:

答案 0 :(得分:1)

问题出在贪婪量词的默认用法。

使用(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将被视为结束组。

Demo

答案 1 :(得分:0)

根据您提供的模式,您可能会有重叠的匹配项。以下内容将找到所有匹配项,包括重叠的匹配项:

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;

答案 2 :(得分:0)

Perl必需的正则表达式功能,而不是像grep这样的普通正则表达式,是懒惰的量词:跟随*或+量词。它匹配*(+)标记之前的字符的零(一)个或多个出现,是尽可能短的glob匹配

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