2011-03-07 59 views
0

我寫了一個自定義的語言Python的解析器和現在我有這樣的事情:如何改進我的解析技巧?

re1 = re.compile(r"...") 
re2 = re.compile(r"...") 
re3 = re.compile(r"...") 
re4 = re.compile(r"...") 
... 
... 

現在我正在讀輸入文件和每行,如果我找到一個特定的關鍵字,然後我使用特定的正則表達式。顯然,這是使我的生活變成地獄,因爲我在做這樣的事情:

if line.find("keyword1") >= 0 
    # Uses re1 to match the string 
    invoke_handler1() 
elif line.find('keyword2") >= 0 
    # Uses re2 to match the string 
    invoke_handler2() 
... 

與此同時,我不想給定線路與所有可能的正則表達式匹配,因爲那將是一種浪費。在不丟棄我寫下來的所有內容之前,是否有一種解決這個問題的優雅方法,並使其更加高效和易讀?

+1

你有沒有考慮過使用真正的[parser](http://wiki.python.org/moin/LanguageParsing)? – nmichaels 2011-03-07 20:52:52

+0

這是什麼解析器?你能詳細說明你正在解析的文本/代碼的複雜性嗎? – 2011-03-07 20:54:10

+0

@nmichaels:我想我需要更多地瞭解這一點。謝謝! @Nicolas Buduroi:我正在解析一個字節碼反彙編。 – Legend 2011-03-07 20:55:44

回答

2

我不認爲這是你正在尋找的答案,但我認爲你會用一個實際的Lexer和Tokenizer解析你的語言會有更好的時間。我建議看看並學習使用PLY來完成這種任務。

1

您可能想要創建一個數據結構maps到RE的關鍵字。但說實話,我會嘗試讓RE作爲第一優先級快速失敗,然後循環遍歷它們。

失敗快速RE的示例將以「^ Sometext」開頭,就好像第一個字符與「S」不匹配,然後RE的其餘部分不被評估。