繁体   English   中英

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

[英]How to find repeated substring in a string using regular expressions in Python?

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

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

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

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

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

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

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"

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM