我需要创建一个匹配的regex来寻找基因序列,我被困在了一个特定的问题后面--首先,启动密码子ATG,跟随来自三个核苷酸的其他密码子,然后以三个可能的密码子TAA、TAG和TGA结束。如果停止(结束)密码子位于开始(ATG)密码子之后怎么办?当开始密码子和停止密码子之间有中间密码子时,我的当前正则表达式工作,但如果没有,则该正则表达式匹配开始密码子之后的所有序列。我知道为什么会这样,但我不知道如何按照我想要的方式改变它。
我的正则表达式应该查找AGGAGG (确切地说是此模式),然后是A、C、G或T (从4到12次),然后是ATG (正是这种模式),然后是A、C、G或T (以三元组(例如,ACG、TGC等等),直到它匹配TAA、TAG或d19,这并不重要。搜索应该在那之后结束,然后再开始。
良好匹配的例子:
XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
AGGAGGTATGATGCGTACGGGCTAGTAGAGGAGGTATGATGTAGTAGCATGCT序列中有两种匹配--从0到25,从28到44。
我现在的正则表达式(不要介意前两个括号):
$seq =~ /(AGGAGG)([ACGT]{4,12})(ATG)([ACTG]{3,3}){0,}(TAA|TAG|TGA)/ig发布于 2019-04-11 10:58:21
这里的问题来自贪婪量词的默认用法。
当使用(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将被视为结束组。
演示。
发布于 2019-04-11 12:42:29
根据你给出的模式,你可以有重叠的匹配。以下将查找所有匹配,包括重叠匹配:
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;发布于 2019-04-25 09:52:30
Perl的基本regex特性(与grep这样的普通regex特性相反)是惰性量词:?在*或+量词后面。它将0(1)或更多出现在* (+)令牌之前的字符匹配为最短的glob匹配。
$seq =~ /((AGGAGG)([ACGT]{4,12})(ATG)([ACGT]{3})*?(TAA|TAG|TGA))/igxhttps://stackoverflow.com/questions/55629162
复制相似问题