2009-08-10 13 views
3

我有一個python腳本,它逐行處理文件,如果行 匹配正則表達式,它會調用一個函數來處理它。重構我的python腳本需要幫助

我的問題是有沒有更好的寫法來重構我的腳本。 腳本的作品,但因爲它,我需要保持縮進 編輯器的權利,因爲我爲我的文件添加更多的正則表達式。

謝謝你的任何想法。 現在我的代碼最終會是這樣的:

 
for line in fi.readlines(): 

     result= reg1.match(line) 

     if result: 
       handleReg1(result) 

     else: 
       result = reg2.match(line) 

       if result: 
         handleReg2(result) 
       else: 
         result = reg3.match(line) 

         if result: 
           handleReg3(result) 
         else: 
           result = reg4.match(line) 

           if result: 
             handleReg4(result) 
           else: 
             result = reg5.match(line) 

             if result: 
               handleReg5(result) 
+4

你有什麼理由避免elif? – balpha 2009-08-10 19:25:45

回答

12

我切換到使用一個數據結構映射到正則表達式的功能。喜歡的東西:

map = { reg1: handleReg1, reg2: handleReg2, etc } 

然後你只需通過他們的循環:

for reg, handler in map.items(): 
    result = reg.match(line) 
    if result: 
     handler(result) 
     break 

如果需要匹配特定的順序發生,你需要使用一個列表,而不是一本字典,但校長是一樣的。

+0

這也是我推薦的方法。正如sam提到的,如果你需要一個特定的順序,你可能想要使用一個列表 - 可能類似於'handlers = [(reg1,handleReg1),(reg2,handleReg2),...]'然後你的for循環會看起來像像這樣:'for(reg,handler)in handlers:' – Amber 2009-08-10 19:26:26

+1

你絕對需要一個列表而不是一本字典。這裏沒有關鍵的查找 - 它只是正則表達式和函數之間的關聯。元組列表將會很好。 – hughdbrown 2009-08-10 19:48:56

1

這裏有一個簡單的一個:

handlers = { reg1 : handleReg1, ... } 

for line in fi.readlines(): 
    for h in handlers: 
     x = h.match(line) 
     if x: 
      handlers[h](x) 

如果有可能是匹配幾個正則表達式驗證碼將是您粘貼代碼不同的是:它會調用多個處理程序。添加break不會有幫助,因爲正則表達式會以不同的順序嘗試,所以最終會調用錯誤的順序。所以,如果是這樣的話,你應該遍歷列表:

handlers = [ (reg1, handleReg1), (reg2, handleReg2), ... ] 

for line in fi.readlines(): 
    for reg, handler in handlers: 
     x = reg.match(line) 
     if x: 
      handler(x) 
      break 
+0

這不完全相同;你的方式可能會叫幾個處理程序;他的電話至多一個。 – balpha 2009-08-10 19:29:02

+0

以上版本不相同,因爲它可能會嘗試正則表達式,因爲它們的順序與reg1,reg2,... – 2009-08-10 19:31:44

0

,可能爲你工作是把所有的正則表達式組合成一個巨大的正則表達式,並使用m.group()來檢測其匹配的另一種方法。我的直覺說這應該會更快,但我還沒有測試過。

>>> reg = re.compile('(cat)|(dog)|(apple)') 
>>> m = reg.search('we like dogs') 
>>> print m.group() 
dog 
>>> print m.groups() 
(None, 'dog', None) 

如果您正在測試的正則表達式本身很複雜或使用匹配組,則會變得複雜。

+0

不同,它的速度非常快,針對複雜且使用匹配組的內部正則表達式的補救措施是在它們周圍使用命名組(在「命名空間」中,例如w/a前綴,與可能由內部正則表達式使用的任何命名組不相交)。 – 2009-08-10 21:39:08