簡體   English   中英

Python正則表達式:如何重復模式的重復?

[英]Python Regular Expressions: How to repeat a repeat of a pattern?

我正在研究一長串DNA核苷酸,我正在尋找以起始代碼'AAA'開頭並以終止代碼'CCC'結束的序列。 由於核苷酸是三聯體,我發現每個序列的起點和終點之間的核苷酸數必須是三的倍數。

例如,'AAAGGGCCC'是有效序列,但'AAAGCCC'不是。

另外,在每個停止代碼之前,我想要找到關於特定閱讀框的最長鏈。

例如,如果DNA是'AAAGGGAAACCC',那么'AAAGGGAAACCC'和'AAACCC'在技術上都是有效的,但由於它們共享相同的終止代碼實例,我只想要最長的DNA鏈'AAAGGGAAACCC'。 另外,如果我的鏈是'AAAAGGCCCCC',我必須返回'AAAAGGCCC'和'AAAGGCCCC'因為它們在不同的閱讀框中(一個閱讀框是mod 3,另一個是mod 1.)

雖然我認為我有代碼來搜索滿足3個要求的倍數並且不重疊的字符串,但我不確定如何實現保持相同閱讀框的第二個標准。 我下面的代碼只返回不重疊的最長字符串,但不區分讀取幀,所以在上面的示例中它會捕獲'AAAAGGCCC'而不是'AAAGGCCCC':

match = re.finditer(r"AAA\w{3}{%d}BBB$"% (minNucleotide-6, math.ceil((minNucleotide-6)/3))

很抱歉啰嗦,謝謝你看看!

使用積極的先行斷言 這允許您在字符串中的每個字符處重新應用正則表達式,從而可以找到所有重疊匹配,因為前瞻斷言不會消耗任何字符,如正常匹配。 由於您仍需要匹配一些實際文本,因此您可以使用捕獲組

由於re.findall()返回捕獲組的內容而不是完整的正則表達式匹配(這些都是'' ),因此您可以使用:

>>> import re
>>> re.findall(r"(?=(AAA(?:\w{3})*?CCC))", "AAAAGGCCCC")
['AAAAGGCCC', 'AAAGGCCCC']

作為一個評論的Python函數:

def find_overlapping(sequence):
    return re.findall(
    """(?=        # Assert that the following regex could be matched here:
     (            # Start of capturing group number 1.
      AAA         # Match AAA.
      (?:         # Start of non-capturing group, matching...
       [AGCT]{3}  # a DNA triplet
      )*?         # repeated any number of times, as few as possible.
      CCC         # Match CCC.
     )            # End of capturing group number 1. 
    )             # End of lookahead assertion.""", 
    sequence, re.VERBOSE)

想到的最簡單的模式是:

'AAA(\w{3})*CCC'
            ^^^ stop code
           ^ zero or more of…
    ^     ^ a group of…
     ^^^^^ three characters
 ^^^ start code

如果您對三個字符組的數量有其他要求,例如“至少兩個這樣的組”,您現在可以輕松地將正則表達式中的星形字符替換為您需要的字符。

至於最長的比賽和不同的幀,我不確定。 從技術上講,明星角色已經貪婪,這將匹配可能的最長字符串,因此應該滿足您的要求。 但是我擔心這個功能以及在單個幀中不共享子串的要求會很糟糕地進行交互。

我認為最明確的方法是要求正則表達式引擎為您提供所有匹配,無論長度和幀如何(只要內部部分的長度可以被3整除),然后在正則表達式之外排除情況。

如果你真的想使用正則表達式引擎來做到這一點,我可以想到一種方法 - 通過運行特定的正則表達式三次,每幀一次。 這些正則表達式將是:

^(?:\w{3})*AAA(\w{3})*CCC
^(?:\w{3})*\wAAA(\w{3})*CCC
^(?:\w{3})*\w\wAAA(\w{3})*CCC

如您所見,它們中的每一個首先匹配3k,3k + 1或3k + 2個字符 - 這樣AAA起始代碼將從不同的幀開始。 要獲得匹配的部分,您需要檢查返回的匹配對象。 我真的不知道重疊序列會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM