2017-04-12 83 views
2

我有一些長度只有4個字符的字符串,它們是'A,T,G和C'。我在給定的字符串中出現了多次「GAATTC」模式。我不得不削減的字符串在間隔,其中這種模式.. 例如,對於一個字符串,「ATC GAATTC ATA」,我應該得到的python中的特定模式內的字符串切割

  • 串一個輸出 - ATCGA
  • 線二 - ATTCATA

我是新手在使用Python,但我想出了以下(不完全)代碼:

seq = seq.upper() 
str1 = "GAATTC" 
seqlen = len(seq) 
seq = list(seq) 

for i in range(0,seqlen-1): 
    site = seq.find(str1) 
    print(site[0:(i+2)]) 

任何幫助將非常感激。

+1

什麼是你的問題嗎? – TigerhawkT3

+0

爲什麼期望的輸出包含分割字符串的部分,我們應該如何將它分爲字符串1和字符串2? – tripleee

+0

@ TigerhawkT3我如何剪斷絃樂?我想找到'GAATTC'模式,並且在這種模式下,我想將字符串拆分爲'GA',這樣生成的字符串將給我快達GA的一半,並從ATTC開始給我下半部分。這與上面提到的例子有關。對不起,造成任何混亂。 – Srk

回答

2

首先讓你的開發利用找到的想法,這樣你就可以找出你的錯誤。

seq = 'ATCGAATTCATAATCGAATTCATAATCGAATTCATA' 
seq = seq.upper() 
pattern = "GAATTC" 
split_at = 2 
seqlen = len(seq) 
i = 0 

while i < seqlen: 
    site = seq.find(pattern, i) 
    if site != -1: 
     print(seq[i: site + split_at]) 
     i = site + split_at 
    else: 
     print seq[i:] 
     break 

然而,python字符串運動一個強大的替換方法,直接替換字符串的片段。下面的代碼使用了替代方法,需要時插入分隔符:

seq = 'ATCGAATTCATAATCGAATTCATAATCGAATTCATA' 
seq = seq.upper() 
pattern = "GA","ATTC" 
pattern1 = ''.join(pattern) # 'GAATTC' 
pattern2 = ' '.join(pattern) # 'GA ATTC' 
splited_seq = seq.replace(pattern1, pattern2) # 'ATCGA ATTCATAATCGA ATTCATAATCGA ATTCATA' 
print (splited_seq.split()) 

我相信這是更直觀,應該快了那麼RE(其中可能有更低的性能,具體取決於庫和使用)

+0

第二種解決方案對於第一個來說是相當驚人的。話雖如此,即使是第一個解決方案的工作原理也很好。謝謝你大時間! – Srk

+0

@Srk謝謝,我也很享受,但我有點驚訝,我沒有立即意識到第二個解決方案。增加的好處,替換將適用於任何文本編輯器。順便說一句,如果你發現有用的解決方案,不要猶豫,投票或接受。 – Serge

3

這裏有一個簡單的解決方案:

seq = 'ATCGAATTCATA' 
seq_split = seq.upper().split('GAATTC') 
result = [ 
    (seq_split[i] + 'GA') if i % 2 == 0 else ('ATTC' + seq_split[i]) 
    for i in range(len(seq_split)) if len(seq_split[i]) > 0 
] 

結果:

print(result) 
['ATCGA', 'ATTCATA'] 
+0

如果'GAATTC'在給定字符串中存在多次 – fedterzi

+0

It將工作,但只爲前2項.. –

+0

@謝謝!你的建議確實有效。但是,它僅限於該模式的一次出現。如果模式'GAATTC'多次出現,則不考慮下一次出現。 – Srk

0

我的代碼是有點草率,但你可以嘗試這樣的事情,當你想遍歷的多次出現字符串

def split_strings(seq): 
    string1 = seq[:seq.find(str1) +2] 
    string2 = seq[seq.find(str1) +2:] 
    return string1, string2 


test = 'ATCGAATTCATA'.upper() 
str1 = 'GAATTC' 

seq = test 
while str1 in seq: 
    string1, seq = split_strings(seq) 
    print string1 
print seq 
1

BioPython有一個限制性酶包來做你正在做的事SKING。

from Bio.Restriction import * 
from Bio.Alphabet.IUPAC import IUPACAmbiguousDNA 

print(EcoRI.site) # You will see that this is the enzyme you listed above 

test = 'ATCGAATTCATA'.upper() # This is the sequence you want to search 
my_seq = Seq(test, IUPACAmbiguousDNA()) # Create a biopython Seq object with our sequence 

cut_sites = EcoRI.search(my_seq) 

cut_sites包含的確切位置切斷輸入序列(這樣GA是左的順序並ATTC是在正確的順序清單

然後,您可以分割的順序爲使用重疊羣:

cut_sites = [0] + cut_sites # We add a leading zero so this works for the first 
          # contig. This might not always be needed. 
contigs = [test[i:j] for i,j in zip(cut_sites, cut_sites[1:]+[None])] 

您可以see this page約BioPython更多細節。

+2

我在訪問該模塊時非常困難,無論如何感謝您的解決方案,它對我來說非常合適! – Srk

0

下面是使用正則表達式模塊的解決方案:

import re 
seq = 'ATCGAATTCATA' 
restriction_site = re.compile('GAATTC') 
subseq_start = 0 
for match in restriction_site.finditer(seq): 
    print seq[subseq_start:match.start()+2] 
    subseq_start = match.start()+2 
print seq[subseq_start:] 

輸出:

ATCGA 
ATTCATA