簡體   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