2011-12-10 61 views
0

使用滑動窗口如果有一個窗口列表查找當一個特定的順序在Python 2.7

text='abcdefg' 
window_list=[text[i:i+3] for i in range(len(text)-3)] 
print window_list 
['abc', 'bcd', 'cde', 'def'] 

for i in window_list: 
    for j,k in zip(range(len(text)),i): 
    print j,k 
0 a 
1 b 
2 c 
0 b 
1 c 
2 d 
0 c 
1 d 
2 e 
0 d 
1 e 
2 f 

我試圖讓它發生在字符串中的位置,所以當

(j==0 and k=='c') and (j==1 and k=='d') and (j==2 and k=='e') 

其中,關於字符串文本時它會給我的開始和結束位置

所以它會給我

[2-4] 
+0

你究竟在做什麼? (解釋正確,我會刪除「-1」) – codersofthedark

+0

我試圖掃描一個特定的序列(文本),如果它符合輸入序列('cde'),我希望它給我的範圍它涵蓋的原始序列。所以如果'abcdefg'的結果是[2-5]或[2-4](無論範圍如何),如果序列是'abbbbbbcdef',返回值將會不同。基本上主要的是它必須按照這個順序。我的理想做法是檢查位置0是否爲'c',位置1是'd',位置2是'e' –

+0

,您需要通過編輯問題並在其中添加此解釋來改善問題,一旦完成,我會給2+ :) – codersofthedark

回答

3

你有沒有想過這樣做?

>>> text='abcdefg' 
>>> window_list=[text[i:i+3] for i in range(len(text)-3)] 
>>> ["-".join([str(i),str(i+len(w))]) for i,w in enumerate(window_list) if w == 'cde'] #for single item 
['2-5'] 
>>> ["-".join([str(i),str(i+len(w))]) for i,w in enumerate(window_list) if w in ['cde','def']] # for multiple items 
['2-5', '3-6'] 
>>> 

注意:enumerate列表和搜索與條件匹配的項目。返回索引後面跟着結束位置(索引+子序列的長度)。請注意,結果將是一個字符串,而不是您所期望的。

+0

+1對於基本上是一個班輪 –

+0

如果序列是text ='abbbbbeeeecdefbbbbb',那麼仍然可以工作嗎?或者它在搜索特定值2-5? –

+0

是的,它會工作。試試看看 – Abhijit

0

邏輯:

所有你需要做的是找到,如果你的模式是在doc與否。這可以使用Python在構建的字符串「find」函數中輕鬆完成。一旦你找到你的字符串的開始位置,那麼你所要做的就是添加你的模式的長度來獲得結束位置。而已!完成任務;)

驗證碼:

text = "abcdefghifjklmnopqrstuvwxyz" 
start_position = text.find("abc") 
if(start_position>-1): 
    end_position = start_position+len(start_position) - 1 
else: 
    print "Pattern not found" 
print start_position, "-", end_position 

輸出:

0 - 2 

參考: 檢查Python官方字符串函數文檔

2
import re 
seq = 'abcdefabcdefabcdefg' 
for match in re.finditer('abc', seq): 
    print match.start(), match.end()