gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:22:37 27 4
gpt4 key购买 nike

我在使用正则表达式时遇到了一些麻烦。我有以下一个:(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 步中的量词成为非贪婪的,因为这将测试第 3 步是否匹配,然后再尝试第 2 步是否再次匹配。

那么解决方案如下:

/ (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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com