Python是否有类似Perl的`study`函数?

5

来自Perl的文档:

study函数使用一些额外时间来研究待匹配字符串(SCALAR, 如果未指定则默认为 $_ ),以期在下次修改之前执行大量模式匹配。这可能会节省时间,也可能不会,这取决于您要搜索的模式的性质和数量以及要搜索的字符串的字符频率分布;

我正在Python中尝试加速一些正则表达式驱动的解析工作,并且我想起了Perl中的这个技巧。我意识到我必须进行基准测试才能确定是否有加速,但我找不到Python中等效的方法。


1
Python允许使用re.compile(...)编译正则表达式对象,但这仅涵盖了正则表达式方面。我还没有听说过Python中有任何研究将要搜索的字符串的功能。 - Frg
这本质上是和预处理字符串以实现高效搜索相同的问题。哎呀! - bonsaiviking
1
你是在问Python是否有一项功能,可以实际减慢匹配速度,并且不能处理ASCII之外的内容吗?(我认为他们在5.16中将使“study”成为无操作。) - ikegami
1
@Frg,re.compile 相当于 Perl 的 qr// - ikegami
2个回答

8

Perl的study函数已经不再起作用了。现在编译的正则表达式比study创建时聪明得多。

例如,它将备选项编译成带有Aho-Corasick预测的trie结构。

使用perl -Mre=debug运行以查看正则表达式编译器和执行引擎应用的巧妙技巧。


6
据我所知,Python本身没有类似的功能。但根据perldoc中的描述:
study的工作方式如下:创建一个链表,其中包含要搜索的字符串中的每个字符,因此我们知道例如所有"k"字符的位置。从每个搜索字符串中选择最稀有的字符,基于从一些C程序和英文文本构建的某些静态频率表。只检查包含这个“最稀有”字符的位置。
这听起来并不是很复杂,你可能可以自己拼凑出一个等效的解决方案。 esmre有点类似。而且,如果您要重用单个正则表达式(以避免反复解析正则表达式本身),则需要使用re.compile,正如@Frg注意到的那样。

或者,您可以使用
后缀树(此处是一个实现,或这里是一个带有Unicode支持的C扩展)或后缀数组实现)。

感谢这篇有趣的阅读。您提供的链接应该是esmre,而不是emsre。我相信现在我不需要“study”功能了,但是您的回答非常有帮助。我已经在编译我的正则表达式了。 - bonsaiviking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接