[英]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
對於上面的字符串s
, AGATC
將首先被匹配,但否定的前瞻將發現AGATC
作為AGATCAGATC
的第一部分,因此暫時匹配將被拒絕。 然后AGATCAGATC
將被匹配,但負前瞻將發現AGATCAGATC
作為AGATCAGATCAGATC
的第一部分,因此也將拒絕試探性匹配。 接下來, AGATCAGATCAGATC
將被匹配並接受,因為否定前瞻將不會在字符串中找到該匹配項。 ( re.findall
與re.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.