2011-04-15 44 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]