2013-06-25 24 views
0

我要匹配字符串中所有出現的字符串,返回所有比賽首發的位置:輸入數據的Python的比賽的所有子和逆轉串

例如:

2 4 
AC 
TGGT 
4 25 
CATA 
TCATATGCAAATAGCTGCATACCGA 
0 0 ## to end the file 

我想做到這一點沒有在這樣的行中使用數字,因爲它看起來並不是真的必要;(但它們仍然在輸入文件中)

而且我不知道這段代碼究竟出了什麼問題,但它仍然保持打印(無限循環)在輸出文件上打印0。

#!/usr/bin/env python 
import sys 
from operator import itemgetter 
def find_all(a_str, sub): 
    start = 0 
    while True: 
     start = a_str.find(sub, start) 
     if start == -1: return 
     yield start 
     start += len(sub) 

if __name__ == '__main__': 
    testnum=0 
    input_file = open(sys.argv[1]) 
    #input_lines=input_file.split("\n") 
    output_file = open(sys.argv[2],"w") 
    while True: 
     testnum+=1 
     values_raw = input_file.readline() 
     #values_raw=raw_input() ##rubish 
     values=values_raw.split() 
     flag=0 
     for element in values: 
      if element == "0": 
      break 
     string1=str(input_file.readline()) 
     string2=str(input_file.readline()) 
     lista = find_all(string2,string1) 
     output_file.write("\nTeste "+str(testnum)+"\nocorrencia direta: ") 
     for item in lista: 
     output_file.write(str(item)+" ") 
     #reversed search 
     string1=string1[::-1] 
     lista = find_all(string2,string1) 
     output_file.write("\nTeste "+str(testnum)+"\nocorrencia inversa complementar: ") 
     for item in lista: 
     output_file.write(str(item)+" ") 
     if ((len(string1)==0)): 
     break 

粘貼代碼時,我不小心刪除的字符串1和字符串線//我匹配的原件和對反式比賽,但由於代碼是我想我不應該張貼它也幾乎是相同的。

+1

'如果元素== 0'始終是假的。 'element'是一個'str',而不是一個數字。此外,'string1'和'string2'永遠不會被分配 - 它們在這段代碼中沒有綁定。 – Elazar

+0

我不小心刪除了他們原來的帖子,但我相信我所做的讀取文件是錯誤的... – Mansueli

回答

1

您可以使用regex

>>> import re 
>>> pat = 'CATA' 
>>> strs = 'TCATATGCAAATAGCTGCATACCGA' 
>>> [m.start() for m in re.finditer(pat, strs)] 
[1, 17] 
+0

如果他想匹配相反的模式,他可以'set([m.start()for m在re.finditer(pat [:: - 1],strs)])中設置m中的m.start() – wflynny