2016-11-22 37 views
0

我在看: Python regex find all overlapping matches?re.finditer不適合我。我不想再下載另一個模塊(即regex)來替換內置的re。我以爲我可以自己寫,但我對while loops的理解是有限的。查找所有重疊模式無限循環,使用Python 3和動態編程

我試圖做一個搜索包裝,發現所有模式,即使它們重疊(目前findall不在re)。

我也從來沒有試過編程這樣的東西,所以我不想嘗試使用內置模塊來構建我自己的函數,所以我可以學習如何動態編程。

def findall_positions(pattern, sequence): 
    positions = list() 
    cont = True 

    while cont == True: 
     match = re.search(pattern, sequence) 
     if match is not None: 
      positions.append(match.start()) 
      sequence = sequence[positions[-1]:] 
     if match is None: 
      cont = False 
    return positions 

findall_positions("AB","ABBABBABBBA") 

我的邏輯是做re.search,如果有一擊,開始追加到positions,那麼第一re.search match後得到的字符串接下來的拉伸和遍歷,直到match is None。但是,我正在陷入無限循環。 我如何重構這個來獲得正確的結果?我正在尋找的[0,3,6]

回答

2

的輸出與上述方法的問題是,第一場比賽的開始偏移量0,因此在第一次循環positions[0]。然後sequence = sequence[positions[-1]:]自然結果爲原始字符串,因此你有無限循環。

你可以有一個單獨的變量來跟蹤偏移量,並在每次做re.search時構造新的字符串。如果找到匹配,則相應地調整位置:

import re 

def findall_positions(pattern, sequence): 
    positions = list() 
    cont = True 
    offset = 0 

    while cont == True: 
     match = re.search(pattern, sequence[offset:]) 
     if match is not None: 
      positions.append(match.start() + offset) 
      offset = positions[-1] + 1 
     if match is None: 
      cont = False 
    return positions 

print(findall_positions("AB","ABBABBABBBA")) 

輸出:

[0, 3, 6]