我正在查看一长串 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))
Run Code Online (Sandbox Code Playgroud)
抱歉啰嗦了,感谢您的浏览!
使用积极的前瞻断言。这允许您在字符串中的每个字符处重新应用正则表达式,从而可以找到所有重叠的匹配项,因为前瞻断言不会像正常匹配那样消耗任何字符。由于您仍然需要匹配一些实际文本,因此您可以为此使用捕获组。
由于re.findall()返回捕获组的内容而不是完整的正则表达式匹配项(都是''),您可以使用:
>>> import re
>>> re.findall(r"(?=(AAA(?:\w{3})*?CCC))", "AAAAGGCCCC")
['AAAAGGCCC', 'AAAGGCCCC']
Run Code Online (Sandbox Code Playgroud)
作为注释的 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6814 次 |
| 最近记录: |