我在正则表达式方面遇到了一些问题。我有以下一个: (A|C|G|T){3}
它给出了 A、B、C、D 中三个字母的每种排列,但现在我想排除三个特定模式: "TAG"
、"TAA"
和 "TGA"
。尝试使用 [^]
,但没有产生预期结果。使用 look-around 也是如此(向前看和向后看)。
我想要实现的是找到所有以“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)
最佳答案
如果我理解正确的话:
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
与您第二个想法的区别在于,将量词内的负前瞻移动以获得“多个三元组”步骤,确保这三个三元组都不是异常(exception)之一
此解决方案不假设步骤 2 和步骤 3 中的元素之间有任何共性。更简单但在您的情况下等效的公式将是:
1) 匹配“ATG”
2) 匹配多个三元组
3) ...直到匹配“TAG”、“TAA”、“TGA”。
为此,您只需将步骤 2 中的量词设置为非贪婪,因为这将在尝试步骤 2 是否再次匹配之前测试步骤 3 是否匹配。
那么解决方案将如下所示:
/ (ATG) ([ACGT]{3})*? (TAG|TAA|TGA) /x
另一种解释可能是:
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/;
关于regex - 如何从 Perl 的正则表达式中排除特定模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624459/