gpt4 book ai didi

Python 正则表达式 : How to repeat a repeat of a pattern?

转载 作者:太空狗 更新时间:2023-10-30 02:46:50 28 4
gpt4 key购买 nike

我正在查看一长串 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))

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

最佳答案

使用 positive lookahead assertion .这允许您在字符串中的每个字符处重新应用正则表达式,从而可以找到所有重叠的匹配项,因为先行断言不会像普通匹配那样消耗任何字符。由于您仍然需要匹配一些实际文本,您可以使用 capturing group为了那个原因。

由于 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)

关于Python 正则表达式 : How to repeat a repeat of a pattern?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680546/

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