【问题标题】:Is there a Python equivalent for Perl's `study`?Perl 的“学习”是否有 Python 等价物?
【发布时间】:2012-03-05 21:23:24
【问题描述】:

来自 Perl 的documentation

study 需要额外的时间来研究 SCALAR ($_ 如果未指定) 在下一次修改之前,字符串上有许多模式匹配。这可能会也可能不会保存 时间,取决于您正在搜索的模式的性质和数量以及分布 要搜索的字符串中的字符频率;

我正在尝试加快我在 Python 中执行的一些正则表达式驱动的解析,我记得 Perl 中的这个技巧。我意识到我必须进行基准测试以确定是否有加速,但我在 Python 中找不到等效的方法。

【问题讨论】:

  • Python 允许使用re.compile(...) 编译正则表达式对象,但这涵盖了正则表达式方面。我还没有听说过 Python 中有任何东西会研究要搜索的字符串。
  • 这与Preprocess string for efficient search本质上是同一个问题。糟糕!
  • 你是在问python是否有一个特性,它实际上会减慢你的匹配速度,并且不能处理超出 ASCII 的内容? (我认为他们在 5.16 中让 study 成为空操作。)
  • @Frg, re.compile 相当于 Perl 的 qr//

标签: python regex perl optimization


【解决方案1】:

Perl 的研究实际上已经不再有用了。编译的正则表达式比创建study 时要智能得多。

例如,它使用 Aho–Corasick 预测将备选方案编译成 trie 结构。

使用perl -Mre=debug 运行,看看正则表达式编译器和执行引擎应用的各种聪明之处。

【讨论】:

    【解决方案2】:

    据我所知,Python 中没有这样的内置功能。但是根据the perldoc

    研究的工作方式是这样的:每个字符的链表 要搜索的字符串是生成的,所以我们知道,例如,所有的 'k' 字符是。从每个搜索字符串中,最稀有的字符是 选择,基于从一些构建的一些静态频率表 C程序和英文文本。只有那些包含这个的地方 检查“最稀有”的字符。

    这听起来不是很复杂,您可能可以自己拼凑一些等效的东西。

    esmre 有点相似。而as @Frg noted,如果您要重用单个正则表达式,则需要使用re.compile(以避免一遍又一遍地重新解析正则表达式本身)。

    或者你可以使用suffix trees(这里是one implementation,或者这里是C extension with unicode support)或suffix arraysimplementation)。

    【讨论】:

    • 感谢您的有趣阅读。不过,您的链接应该是 esmre,而不是 emsre。在这一点上,我很确定我不需要 study 功能,但您的回答非常有帮助。我已经在编译我的正则表达式了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2012-07-17
    • 2012-06-14
    • 2014-01-09
    • 2012-03-20
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多