4

我正在查看一条长链 DNA 核苷酸,并正在寻找以起始代码“AAA”开头并以终止代码“CCC”结尾的序列。由于核苷酸以三联体形式出现,因此我发现的每个序列的开头和结尾之间的核苷酸数必须是三的倍数。

例如,'AAAGGGCCC' 是有效序列,但 'AAAGCCC' 不是。

此外,在每个终止码之前,我想要我能找到的关于特定阅读框的最长链。

例如,如果 DNA 是“AAAGGGAAACCC”,那么“AAAGGGAAACCC”和“AAACCC”在技术上都是有效的,但由于它们共享相同的终止码实例,我只想要最长的 DNA 链“AAAGGGAAACCC”。另外,如果我的链是“AAAAGGCCCCC”,我必须返回“AAAAGGCCC”和“AAAGGCCCC”,因为它们处于不同的阅读框架中(一个阅读框架是 mod 3,另一个是 mod 1。)

虽然我认为我有代码来搜索满足 3 的倍数要求且不重叠的字符串,但我不确定如何实现保持相同阅读框架的第二个标准。我下面的代码只会返回最长的不重叠的字符串,但不区分阅读框架,所以在上面的例子中它会捕获'AAAAGGCCC'而不是'AAAGGCCCC':

match = re.finditer(r"AAA\w{3}{%d}BBB$"% (minNucleotide-6, math.ceil((minNucleotide-6)/3))

抱歉啰嗦了,感谢您的观看!

4

2 回答 2

6

使用积极的前瞻断言。这允许您在字符串中的每个字符处重新应用正则表达式,从而可以找到所有重叠的匹配,因为前瞻断言不会像普通匹配那样消耗任何字符。由于您仍然需要匹配一些实际文本,因此您可以使用捕获组

由于re.findall()返回捕获组的内容而不是完整的正则表达式匹配(全部为''),您可以使用:

>>> import re
>>> re.findall(r"(?=(AAA(?:\w{3})*?CCC))", "AAAAGGCCCC")
['AAAAGGCCC', 'AAAGGCCCC']

作为注释的 Python 函数:

def find_overlapping(sequence):
    return re.findall(
    """(?=        # Assert that the following regex could be matched here:
     (            # Start of capturing group number 1.
      AAA         # Match AAA.
      (?:         # Start of non-capturing group, matching...
       [AGCT]{3}  # a DNA triplet
      )*?         # repeated any number of times, as few as possible.
      CCC         # Match CCC.
     )            # End of capturing group number 1. 
    )             # End of lookahead assertion.""", 
    sequence, re.VERBOSE)
于 2013-09-08T06:00:21.467 回答
1

想到的最简单的模式是:

'AAA(\w{3})*CCC'
            ^^^ stop code
           ^ zero or more of…
    ^     ^ a group of…
     ^^^^^ three characters
 ^^^ start code

如果您对三字符组的数量有额外要求,例如“至少两个这样的组”,您现在可以轻松地将正则表达式中的星号替换为您需要的字符。

至于最长的匹配和不同的帧,我不确定。从技术上讲,星号已经是贪婪的,即会匹配可能的最长字符串,因此应该可以满足您的要求。但我担心这个功能以及在单个帧中不共享子字符串的要求会产生不良影响。

我认为最清楚的方法是要求正则表达式引擎为您提供所有匹配项,而不管长度和帧(只要内部部分的长度可以被3整除),然后在正则表达式之外理清情况。

如果你真的想使用正则表达式引擎来做到这一点,我能想到一种方法——运行特定的正则表达式三次,每帧一次。这些正则表达式将是:

^(?:\w{3})*AAA(\w{3})*CCC
^(?:\w{3})*\wAAA(\w{3})*CCC
^(?:\w{3})*\w\wAAA(\w{3})*CCC

如您所见,它们中的每一个首先匹配 3k、3k+1 或 3k+2 个字符——因此 AAA 起始码将从不同的帧开始。要获得匹配的部分,您需要检查返回的匹配对象。而且我真的不知道重叠序列会发生什么。

于 2013-09-08T05:41:36.537 回答