如何在 Python 中使用正则表达式查找字符串中重复的子字符串?

我试图在 DNA 序列中找到最长的连续重复 DNA 核苷酸链。DNA序列是一个字符串。因此,例如,如果我有"AGA",我想知道链中最长的连续重复链的长度"AGA"

我正在考虑使用正则表达式来提取核苷酸的所有重复链并将它们存储在列表中(使用re.findall())。然后简单地从它们中找出最长的链,取其长度并将其除以核苷酸序列的长度。

我可以为此写什么正则表达式?例如[AGA]+,我在想,但它会识别带有 AGA 的子字符串。我想要类似的东西,以便它识别"AGA"并重复。

注意:如果序列为AATGAGAAGAAGATCCTAGAAGAAGAAGAAGACGAT,则有两条连续的链"AGA",一条长度为3,另一条长度为5。因此最长的链长度为5。


婷婷同学_
浏览 256回答 3
3回答

皈依舞

您可以使用以下正则表达式的第一个匹配项:r'((?:AGA)+)(?!.*\1)'Python 代码&nbsp;<&nbsp;¯\&nbsp;(ツ)&nbsp;/¯&nbsp;>&nbsp;启动你的引擎!Python 的正则表达式引擎执行以下操作。(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : begin capture group 1&nbsp; (?:AGA)&nbsp; : match 'AGA' in a non-capture group&nbsp; +&nbsp; &nbsp; &nbsp; &nbsp; : execute non-capture group 1+ times)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : end capture group 1(?!&nbsp; &nbsp; &nbsp; &nbsp; : begin negative lookahead&nbsp; .*&nbsp; &nbsp; &nbsp; &nbsp;: match any character other than line terminators 0+ times&nbsp;&nbsp; \1&nbsp; &nbsp; &nbsp; &nbsp;: match contents of capture group 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : end negative lookahead"AGA"如果字符串中的另一个字符串"AGA"'s 至少与候选字符串一样长,则这将拒绝候选字符串's。很可能有多个匹配项。例如,如果字符串是AGAAGAAGATAGATAGAAGATAGA^^^^^^^^^&nbsp; &nbsp; &nbsp;^^^^^^ ^^^正如我在派对帽子上所指出的那样,将会有三场比赛。由于匹配项的长度始终从左到右不递减,因此任何匹配项都不会比第一个匹配项长。因此,我们可能会选择第一个匹配项。如果想要识别所有最长的匹配项(应该有多个具有最长长度的匹配项),可以使用上面的正则表达式来获得一个匹配项,比方说,四个'ABA‘s,然后将字符串与正则表达式匹配r'(?:ABA){4}'。

慕少森

您可以使用表达式((AGA)\2*)(&nbsp;regex101&nbsp;):例如:s = 'AATGAGAAGAAGATCCTAGAAGAAGAAGAAGACGAT'to_find = 'AGA'm = max(re.findall(r'(({})\2*)'.format(to_find), s), key=lambda k: k[0])[0]print(m, len(m) // len(to_find))印刷:AGAAGAAGAAGAAGA 5

智慧大石

这是另一种查找匹配子序列的方法。re.findall("(?:AGA)+",&nbsp;"AATGAGAAGAAGATCCTAGAAGAAGAAGAAGACGAT")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python