2012-03-05 70 views
4

從Perl的documentationPerl的`study`有沒有相當於Python的東西?

study需要額外的時間來研究標量($ _如果未指定)做 許多圖案的預期之前,下一個修改過的字符串相匹配。這可能會或可能不會節省 時間,具體取決於要搜索的字符串的性質和數量以及字符頻率的分佈 ;

我試圖加快一些正在使用Python進行正則表達式驅動的解析,並且我記住了Perl的這個技巧。我意識到必須通過基準測試來確定是否有加速,但是我無法在Python中找到等效的方法。

+1

Python允許使用're.compile(...)'編譯正則表達式對象,但涵蓋了正則表達式。我還沒有聽說過Python中會研究要搜索的字符串的任何內容。 – Frg 2012-03-05 21:32:31

+0

這與「用於高效搜索的預處理字符串」(http://stackoverflow.com/q/9370740/1183387)基本相同。哎呀! – bonsaiviking 2012-03-05 22:08:02

+1

你問是否python有一個功能,實際上減慢你的比賽,並沒有處理太多超越ASCII? (我認爲他們在5.16中將'study'設置爲no-op。) – ikegami 2012-03-05 22:19:28

回答

6

據我所知,這裏沒有像Python這樣內置的東西。但根據the perldoc

研究的工作方式是這樣的:要搜索製成的 字符串中的每個字符的鏈表,所以我們知道,例如,所有的 「K」字符。從每個搜索字符串中,根據從某些 C程序和英文文本構建的某些靜態頻率表,選擇最稀有的字符 。只有那些包含這個「最稀有」字符的地方纔會被檢查。

這聽起來不太複雜,你也許可以將自己的東西拼湊在一起。

esmre是一種模糊的相似。和as @Frg noted,如果您重複使用單個正則表達式(以避免重新解析正則表達式本身),您將需要使用re.compile

或者你可以使用suffix trees(這裏是one implementation,或這裏有一個C extension with unicode support)或suffix arraysimplementation)。

+0

感謝您的有趣閱讀。不過,您的鏈接應該是[esmre](https://code.google.com/p/esmre/),而不是emsre。我非常肯定在這一點上,我不需要'學習'的能力,但你的答案是非常有幫助的。我已經在編譯我的正則表達式。 – bonsaiviking 2012-03-05 22:02:04

8

Perl的研究實際上並沒有多大作用。編譯好的正則表達式比整個創建的時候更加智能。

例如,它使用Aho-Corasick預測將備選方案編譯爲特里結構。

perl -Mre=debug一起運行,看看正則表達式編譯器和執行引擎適用的那種聰明。