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

标签 regex perl

我在正则表达式方面遇到了一些问题。我有以下一个: (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/

相关文章:

linux - fork 并返回而不等待perl中的 child

python - 从整个 Python Pandas 数据框中删除美元符号

javascript - 使用 jquery 将两个双引号替换为一个双引号

java - 将 key=value 的字符串解析为 Map

php - 从 swf 生成图像

linux - 如何在 Perl 中使用 Image::Magic 增加特定像素的 RGB 值?

perl - 为什么 STDIN 会导致我的 Perl 程序卡住?

regex - Bash 正则表达式重命名文件

javascript - 匹配 <pre> 内的 <pre> 和 </pre>

perl - 为什么 Perl 说我只使用一次?为什么这甚至是一个问题?