首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当特定模式与其他模式不匹配时,用于匹配特定模式的Regex

仅当特定模式与其他模式不匹配时,用于匹配特定模式的Regex
EN

Stack Overflow用户
提问于 2019-04-11 09:30:10
回答 3查看 165关注 0票数 0

我需要创建一个匹配的regex来寻找基因序列,我被困在了一个特定的问题后面--首先,启动密码子ATG,跟随来自三个核苷酸的其他密码子,然后以三个可能的密码子TAATAGTGA结束。如果停止(结束)密码子位于开始(ATG)密码子之后怎么办?当开始密码子和停止密码子之间有中间密码子时,我的当前正则表达式工作,但如果没有,则该正则表达式匹配开始密码子之后的所有序列。我知道为什么会这样,但我不知道如何按照我想要的方式改变它。

我的正则表达式应该查找AGGAGG (确切地说是此模式),然后是ACGT (从4到12次),然后是ATG (正是这种模式),然后是ACGT (以三元组(例如,ACGTGC等等),直到它匹配TAATAGd19,这并不重要。搜索应该在那之后结束,然后再开始。

良好匹配的例子:

代码语言:javascript
复制
XXXXXXXXXXXXXXXXXXXXXXXXX   XXXXXXXXXXXXXXXX
AGGAGGTATGATGCGTACGGGCTAGTAGAGGAGGTATGATGTAGTAGCATGCT

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

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

代码语言:javascript
复制
$seq =~ /(AGGAGG)([ACGT]{4,12})(ATG)([ACTG]{3,3}){0,}(TAA|TAG|TGA)/ig
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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将被视为结束组。

演示

票数 1
EN

Stack Overflow用户

发布于 2019-04-11 12:42:29

根据你给出的模式,你可以有重叠的匹配。以下将查找所有匹配,包括重叠匹配:

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2019-04-25 09:52:30

Perl的基本regex特性(与grep这样的普通regex特性相反)是惰性量词:?在*或+量词后面。它将0(1)或更多出现在* (+)令牌之前的字符匹配为最短的glob匹配。

代码语言:javascript
复制
$seq =~ /((AGGAGG)([ACGT]{4,12})(ATG)([ACGT]{3})*?(TAA|TAG|TGA))/igx
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55629162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档