如何从perl中的正则表达式中排除特定模式?

use*_*777 1 regex perl

我对正则表达式有点麻烦.我有以下的一个:(A|C|G|T){3}它给出了从A,B,C,d三个字母每种排列,但现在我要排除三个具体模式:"TAG","TAA""TGA".试过[^],但它没有产生预期的结果.使用环视(前瞻和后视)也是如此.

我想要实现的是找到以"ATG"开头的所有子字符串,以"TAG","TAA"或"TGA"结尾,在中间它应该有A,C,G或T的三元组.

谢谢您的帮助!

这是我到目前为止所做的:

(ATG)((((A|C|G|T)){3})[^TAG][^TAA][^TGA])*(TAG|TAA|TGA)

(ATG)((?!TAG)(?!TAA)(?!TGA)(((A|C|G|T)){3})*)(TAG|TAA|TGA)
Run Code Online (Sandbox Code Playgroud)

pma*_*olm 5

如果我理解正确:

1)从ATG开始

2)除了'TAG','TAA'和'TGA'之外的一些三胞胎

3)其中一个三胞胎'TAG','TAA'或'TGA'

这应该工作:

/
   (ATG)                       # Step 1
   ((?!TAG|TAA|TGA)[ACGT]{3})+ # Step 2
   (TAG|TAA|TGA)               # Step 3
/x
Run Code Online (Sandbox Code Playgroud)

与你的区别在于,第二个想法是将量化器中的负面前瞻移动到"多个三元组"步骤,确保三个三元组都不是例外情况之一

该解决方案不假设步骤2和步骤3中的元素之间存在任何共性.更简单但在您的情况下等效的公式将是:

1)匹配'ATG'

2)匹配一些三元组

3)......直到你匹配'TAG','TAA','TGA'.

要做到这一点,你只需要让步骤2中的量词非贪婪,因为如果步骤2再次匹配,这将在尝试之前测试第3步匹配.

然后解决方案看起来像:

/ (ATG) ([ACGT]{3})*? (TAG|TAA|TGA) /x
Run Code Online (Sandbox Code Playgroud)

另一种解释可能是:

1)从ATG开始

2)一些三胞胎

3)其中一个三胞胎'TAG','TAA','TGA'

4)步骤2中找到的子字符串不得包含子字符串'TAG','TAA','TGA'.

在这种情况下,我会使用两个正则表达式来解决它.实施步骤1-3和步骤4中的测试:

 $sequence =~ /(ATG)([ACGT]{3})(TAG|TAA|TGA)/ and $2 !~ /TAG|TAA|TGA/;
Run Code Online (Sandbox Code Playgroud)