2013-02-02 49 views
0

我有一個由1和0組成的傳入字符串;一點一點地建成。這將在某個時候匹配兩種模式中的一種,比如說1001和0101,當它結束時,它終止搜索(這是一次迭代 - 模式將在每次迭代中變化)。在Python中測試字符串中多個字符序列

我想測試要麼模式,然後保持一個帳戶,哪一個終止字符串,所以這個迭代。然後,我需要對傳入的字符串重複該過程 - 使用不同的模式。

我已經編碼了這個,但它是醜陋的恕我直言,我敢肯定有一個更加優雅和有效的方式來做到這一點在Python(我真的是一個新手)。我這樣做是在目前的方法是這樣的:

pattern1 = getPattern1() 
pattern2 = getPattern2() 


while 1: 

    s += nextBit() 

    if s.count(pattern1) and s.count(pattern2): 

     if s.find(pattern1) < s.find(pattern2): 
      tot1 += 1 
     else: 
      tot2 += 1 

     s = '' 

    ... 
+0

如果我已經使用過或者,下一行[s.find()...]會是一個問題。 我,因爲發現的endsWith(),但是,所以我現在有: 而不是s.endswith((模式1,模式2)): – Peter

+0

所以,我現在有 '而不是s.endswith((模式1 ,模式2)):'' S + = nextBit()' ''' 如果s.endswith(模式1):'' ...' 我不喜歡這個的事情是,它複製一項已經實施的測試。 – Peter

+1

不要評論你自己的問題。相反,這個問題。 – jfs

回答

0

首先,寫可讀的代碼是正確的,並表示你的意圖明確衡量業績,並在必要時優化。

你可以使用正則表達式同時搜索和提取方式:

import re 

# match any of the patterns literally at the end of string 
regex = re.compile(r"(?:%s)$" % "|".join(map(re.escape, patterns))) 
def getpattern(s): 
    m = regex.search(s) 
    return m and m.group() 

maxlen = max(map(len, patterns)) 
count = dict.fromkeys(patterns, 0) 
s = "" 
for bit in iter(nextBit, ""): # get bits until empty string 
    s += bit 
    p = getpattern(s) 
    if p: # found pattern 
     count[p] += 1 
     s = "" 
    elif len(s) > maxlen: # limit s size 
     s = s[-maxlen:] 
print(count) 

如果圖案中輸入並不多見然後.endswith(patterns)爲基礎的解決方案可能是更有效的。

要加快速度,請考慮一次讀取多個位並在更大的緩衝區中計數模式。

+0

當模式隨着每次迭代而變化時,如何使用正則表達式? – Peter

+0

您在必要時生成新的正則表達式。 – jfs

+0

哈哈!是的 - 謝謝你! – Peter

相關問題