我需要创建一个匹配的正则表达式来查找遗传序列,但遇到一个特定问题-首先,启动密码子ATG
,也跟随来自三个核苷酸的其他密码子,并且正则表达式以三个可能的密码子结尾TAA
,TAG
和TGA
。如果终止密码子位于起始密码子{ATG
之后,该怎么办?当起始密码子和终止密码子之间存在中间密码子时,我当前的正则表达式将起作用,但是如果没有中间密码子,则正则表达式将匹配起始密码子后的所有序列。我知道为什么会这样做,但是我不知道如何将其更改为我想要的方式。
我的正则表达式应查找AGGAGG
(正是这种模式),然后查找A
,C
,G
或T
(从4到12倍)然后是ATG
(正是这种模式),然后是A
,C
,G
或T
(三元组(例如ACG
,{ {1}}等),无论多长时间,直到它与TGC
,TAA
或TAG
匹配为止。搜索应在此之后结束,然后再开始。
匹配的示例:
TGA
序列中有两个匹配项-从0到25,从28到44。
我当前的正则表达式(不要介意前两个括号)
XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
AGGAGGTATGATGCGTACGGGCTAGTAGAGGAGGTATGATGTAGTAGCATGCT
答案 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