2012-03-05 43 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一起运行,看看正则表达式编译器和执行引擎适用的那种聪明。

相关问题