为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

婷婷同学_ 2023-02-07 09:35:42
我试图在 DNA 序列中找到最长的连续重复 DNA 核苷酸链。DNA序列是一个字符串。因此,例如,如果我有"AGA",我想知道链中最长的连续重复链的长度"AGA"。我正在考虑使用正则表达式来提取核苷酸的所有重复链并将它们存储在列表中(使用re.findall())。然后简单地从它们中找出最长的链,取其长度并将其除以核苷酸序列的长度。我可以为此写什么正则表达式?例如[AGA]+,我在想,但它会识别带有 A或G或A 的子字符串。我想要类似的东西,以便它识别"AGA"并重复。注意:如果序列为AATGAGAAGAAGATCCTAGAAGAAGAAGAAGACGAT,则有两条连续的链"AGA",一条长度为3,另一条长度为5。因此最长的链长度为5。
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

您可以使用以下正则表达式的第一个匹配项:

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

Python 代码 < ¯\ (ツ) /¯ > 启动你的引擎!

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"'s 至少与候选字符串一样长,则这将拒绝候选字符串's。


很可能有多个匹配项。例如,如果字符串是


AGAAGAAGATAGATAGAAGATAGA

^^^^^^^^^     ^^^^^^ ^^^

正如我在派对帽子上所指出的那样,将会有三场比赛。由于匹配项的长度始终从左到右不递减,因此任何匹配项都不会比第一个匹配项长。因此,我们可能会选择第一个匹配项。


如果想要识别所有最长的匹配项(应该有多个具有最长长度的匹配项),可以使用上面的正则表达式来获得一个匹配项,比方说,四个'ABA‘s,然后将字符串与正则表达式匹配r'(?:ABA){4}'。


查看完整回答
反对 回复 2023-02-07
?
慕少森

TA贡献2019条经验 获得超9个赞

您可以使用表达式((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


查看完整回答
反对 回复 2023-02-07
?
智慧大石

TA贡献1946条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2023-02-07
  • 3 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信