2010-07-06 88 views
2

是否存在Pythonic應該如何使用正則表達式的「標準」?Python的正則表達式風格

我通常做的是在我的模塊的頂部進行了一堆re.compile語句和存儲在全局變量的對象......再後來我的函數和類中使用它們。

我可以在我將要使用它們的函數中定義正則表達式,但是隨後它們會被重新編譯。

或者,我可以完全放棄re.compile,但是如果我多次使用相同的正則表達式,似乎重新編譯會導致不必要的開銷。

回答

6

的一種方式,這將是一個更加簡潔使用的字典:

PATTERNS = {'pattern1': re.compile('foo.*baz'), 
      'snake': re.compile('python'), 
      'knight': re.compile('[Aa]rthur|[Bb]edevere|[Ll]auncelot')} 

這將解決您的有污染的命名空間的問題,再加上這是很明顯,任何人都希望你的代碼是什麼格局現在是,將來用於,它滿足全局變量的CAPS約定。另外,您可以輕鬆地撥打re.match(PATTERNS[pattern]),或根據您的邏輯要求調用。

+0

我很喜歡這個!謝謝! – 2010-07-06 16:48:23

1

我個人使用你的第一種方法,我將重用的表達式會在早期編譯並在全局上提供給需要它們的函數/方法。根據我的經驗,這是可靠的,並且減少了它們的總編譯時間。

4

我也傾向於使用你的第一種方法,但我從來沒有基準測試過。有一點需要注意,from the documentation,就是:

通過最近模式的編譯版本re.match(),re.search()或 re.compile()的緩存,所以程序,一次只能使用幾個正則表達式 不用擔心編譯正則表達式。

一個令人擔憂的是,你可能有沒有被使用的正則表達式。如果您在模塊加載時編譯所有表達式,則可能會產生編譯表達式的代價,但從未從該「優化」中受益。我不認爲這會很重要,除非你編譯批次的正則表達式永遠不會被使用。

我建議的一件事是使用re.VERBOSE(或re.X)標誌幷包含註釋和空格,以使超出最普通正則表達式的任何內容更具可讀性。

+0

我不喜歡我的第一種方法的原因是因爲它堵塞了命名空間,並且實際的代碼與運行它的代碼沒有關聯。我希望有一種方法可以使代碼更易於閱讀。 – 2010-07-06 16:23:22

+0

如果您想讓代碼更易於閱讀,請勿使用正則表達式。當然,如果你使用了很多正則表達式,這可能會使你的代碼複雜化。 – 2010-07-06 16:25:58

+1

避免堵塞命名空間的一種方法是在模塊變量之前放置一個或兩個下劃線,以避免導出變量或破壞其名稱。 – 2010-07-06 16:33:09