2011-04-15 41 views
1

我是一個完整的Python noob,所以請原諒我簡單的問題。我正在嘗試編寫一個腳本,它將查找與ATxxxCA,ATxxxxCA,ATxxxxxCA或ATxxxxxxCA匹配的大字符串中的所有序列,其中x可以是任何字符。當ATxxxCA模式匹配時,我會希望腳本捕獲匹配ATxxxCA周圍的前10個和後10個字符。例如,結果可能是這樣的:aaaaaaaaaaATxxxCAbbbbbbbbbbpython len函數問題

我試圖做這樣開始的腳本:

SeqMatch = input("enter DNA sequence to search: ") 
for s in re.findall(r'AT(.*?)CA', SeqMatch): 
    if len(s) is < 10: 
     print(s) 
    else: 
     print('no sequence matches') 

我好像做錯了什麼,我如果循環?誰能幫忙?提前致謝!

+1

我不得不指出BioPython - http://biopython.org/ DIST/docs/tutorial/Tutorial.html#htoc16 – 2011-04-15 22:08:39

+0

執行時會發生什麼?你期望發生什麼? – Bittrance 2011-04-15 22:08:53

+0

不得不指出正則表達式: http://regexpal.com/ 很適合開發/調試正則表達式 – 2011-04-15 22:17:55

回答

1

保重重疊:

import re 

adn = ('TCGCGCCCCCCCCCCATCAAGACATGGTTTTTTTTTTATTTATCAGATTACAGATACA' 
     'GTTATGGGGGGGGGGATATACAGATGCATAGCGATTAGCCTAGCTA') 


regx = re.compile('(.{10})(AT.{3,6}CA)(.{10})') 
res = regx.findall(adn) 
for u in res: 
    print u 

print 

pat = re.compile('(.{10})(AT.{3,6}CA)') 
li = [] 
for mat in pat.finditer(adn): 
    x = mat.end() 
    li.append(mat.groups()+(adn[x:x+10],)) 
for u in li: 
    print u 

結果

('CCCCCCCCCC', 'ATCAAGACA', 'TGGTTTTTTT') 
('GGGGGGGGGG', 'ATATACA', 'GATGCATAGC') 

('CCCCCCCCCC', 'ATCAAGACA', 'TGGTTTTTTT') 
('TTTTTTTTTT', 'ATTTATCA', 'GATTACAGAT') 
('GGGGGGGGGG', 'ATATACA', 'GATGCATAGC') 
+0

太棒了,謝謝你的幫助!這個網站和它的成員真的不可思議。我感謝你容忍我愚蠢的noob問題! – drbunsen 2011-04-16 12:56:17

1

我似乎在做錯了 我的if循環?

Python不知道「is」的含義是什麼(在這種情況下)。

刪除「是」從你的,如果檢查,

if len(s) < 10: 
    print(s) 
else: 
    print('no sequence matches') 

您也說:

當ATxxxCA模式匹配,我 然後會像腳本,然後 捕獲以前10和下一個10 字符圍繞匹配的 ATxxxCA。例如,結果可能 是這樣的: aaaaaaaaaaATxxxCAbbbbbbbbbb

如果你想捕捉的前/和postceding 10個字符,改變你的正則表達式來

(.{10})AT(.*)CA(.{10}) 

你會得到(?)一個結果就是10,然後是AT和CA之間的東西,然後是10bs。

或者,您可以通過使用一組parethesis圍繞整個事情

(.{10}AT.*CA.{10}) 

Regexpal捕獲所有的它是開發/調試regexs一大福音。

+1

假設字符串很長並且有多個匹配項。因此,中間通配​​符需要非貪婪。 – Bittrance 2011-04-15 22:23:41

+0

感謝您指出Regexpal和所有幫助。 – drbunsen 2011-04-16 12:57:09

0

下面是一個例子:

s = "a"*20 + "ATxxxxCA" + "b"*20 
rec = re.compile(r'(AT.{3,6}CA)') 
mo = rec.search(s) 
print s[mo.start()-10:mo.end()+10]