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

2024-05-20 21:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: 字符串列表序列dna核苷酸子串链条aga
3条回答

这是查找匹配子序列的另一种方法

re.findall("(?:AGA)+", "AATGAGAAGAAGATCCTAGAAGAAGAAGAAGACGAT")

可以将第一个匹配项用于以下正则表达式:

r'((?:AGA)+)(?!.*\1)'

Python code<“\(ツ) /'>;Start your engine!

Python的正则表达式引擎执行以下操作

(          : begin capture group 1
  (?:AGA)  : match 'AGA' in a non-capture group
  +        : execute non-capture group 1+ times
)          : end capture group 1
(?!        : begin negative lookahead
  .*       : match any character other than line terminators 0+ times 
  \1       : match contents of capture group 1
)          : end negative lookahead

如果后面的字符串中有另一个"AGA"字符串至少与候选字符串一样长,则拒绝该候选字符串"AGA"

可能存在多个匹配项。例如,如果字符串

AGAAGAAGATAGATAGAAGATAGA
^^^^^^^^^     ^^^^^^ ^^^

正如我在派对礼帽上指出的那样,将有三场比赛。由于比赛的长度从左到右始终不减少,因此没有一场比赛会比第一场比赛长。因此,我们可以选择第一场比赛

如果想要识别所有最长的匹配项(如果有多个匹配项具有最长的长度),可以使用上面的正则表达式获得四个匹配项,然后将字符串与正则表达式匹配

您可以使用表达式((AGA)\2*)regex101):

例如:

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

相关问题 更多 >