我对正则表达式有点麻烦.我有以下的一个:(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)
如果我理解正确:
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)