簡體   English   中英

如何捕獲組的最長序列

[英]How to catch the longest sequence of a group

任務是找到一個組的最長序列

例如,給定 DNA 序列: "AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC" ,它出現了 7 次 AGATC。 (AGATC)匹配所有出現。 是否可以編寫一個僅捕獲最長序列的正則表達式,即給定文本中的AGATCAGATCAGATCAGATCAGATC 如果這僅使用正則表達式是不可能的,我如何遍歷 python 中的每個序列(即第一個序列是AGATCAGATC ,第二個 - AGATCAGATCAGATCAGATCAGATC等等)?

利用:

import re

sequence = "AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC"
matches = re.findall(r'(?:AGATC)+', sequence)

# To find the longest subsequence
longest = max(matches, key=len)

解釋:

非捕獲組(?:AGATC)+

  • +量詞 - 匹配一次到無限次,盡可能多次。
  • AGATC從字面上匹配字符 AGATC(區分大小寫)

結果:

# print(matches)
['AGATCAGATC', 'AGATCAGATCAGATCAGATCAGATC']

# print(longest)
'AGATCAGATCAGATCAGATCAGATC'

您可以在here測試正則表達式。

中心問題是,“是否可以編寫一個只捕獲最長序列的正則表達式?” 答案是“是”:

import re

s = 'AGATC_AGATCAGATC_AGATCAGATCAGATC_AGATC_AGATCAGATC'

m = re.search(r'((?:AGATC)+)(?!.*\1)', s)
print m.group() if m else ''
  #=> "AGATCAGATCAGATC"

正則表達式演示< ¯\ (ツ)> Python 演示

Python 的正則表達式引擎執行以下操作。

(            begin capture group 1
  (?:AGATC)  match 'AGATC' in a non-capture group
  +          execute the non-capture group 1+ times
)            end capture group 1
(?!          begin a negative lookahead
  .*         match 0+ characters
  \1         match the content of capture group 1
)            end the negative lookahead

對於上面的字符串sAGATC將首先被匹配,但否定的前瞻將發現AGATC作為AGATCAGATC的第一部分,因此暫時匹配將被拒絕。 然后AGATCAGATC將被匹配,但負前瞻將發現AGATCAGATC作為AGATCAGATCAGATC的第一部分,因此也將拒絕試探性匹配。 接下來, AGATCAGATCAGATC將被匹配並接受,因為否定前瞻將不會在字符串中找到該匹配項。 re.findallre.search不同,它也會匹配字符串末尾的AGATCAGATC 。)

如果使用了re.findall ,在最長的匹配項之后可能會有多個匹配項(請參閱正則表達式演示鏈接中的最后一個測試字符串),但匹配項的長度從第一個到最后一個不會減少。 因此,使用re.search獲得的第一個匹配是最長的匹配。

使用re.finditer()遍歷所有匹配項。 然后使用帶有鍵 function 的max()來找到最長的。 將其設為 function 以便您可以使用不同的組。

import re

def find_longest(sequence, group):
    # build pattern
    pattern = fr"(?:{group})+"

    # iterate over all matches
    matches = (match[0] for match in re.finditer(pattern, sequence))

    # find the longest
    return max(matches, key=len)

seq = "AGATCAGATCTTTTTTCTAATGTCTAGGATATATCAGATCAGATCAGATCAGATCAGATC"

find_longest(seq, "AGATC")

暫無
暫無

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

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