从字符串的正则表达式列表中选择最紧密匹配正则表达式的方法

时间:2014-02-03 00:49:09

标签: python regex

我有一个字符串列表和一个正则表达列表。我的目标是为每个字符串找到匹配的正则表达式。当然,有时列表中的多个正则表达式将匹配给定的字符串。在这种情况下,我想要一些方法对它们进行排名。

基本上,可以奖励静态零件匹配或更紧凑的东西。例如,假设我的正则表达式是.*:.*STARTING:\d+,而我的字符串是STARTING:18,那么显然我更加相信第二个正则表达式是更好的匹配,因为它匹配静态内容并预测最后的字符将是数字,而不仅仅是任何内容。

我不确定我是否会看到整体算法会如何发展,以及我是否描述了真正的质量(更紧密的匹配),或者它是否会归结为某种启发式'得分'我' d必须分配给每场比赛。

如果有任何不同,我在python中工作。

1 个答案:

答案 0 :(得分:1)

我可以想到几种方法 - 这些只是“朝着这个方向迈出的一步”。

首先 - 在Python中,您可以使用debug标记编译正则表达式,该标记为您提供有关如何解释正则表达式的信息。

示例:

import re
p = re.compile('STARTING:\d+', re.DEBUG)

literal 83
literal 84
literal 65
literal 82
literal 84
literal 73
literal 78
literal 71
literal 58
max_repeat 1 65535
  in
    category category_digit

我想说你匹配的字面数越多,可能匹配的字符串就越少。同样,当max_repeat a b后跟in category category_digit时,您知道在1到64k位置可以有10位数字。如果要计算可匹配的所有可能字符串,则数字会非常大。更容易(也更明智)计算该数字的对数。对于调试输出中的每一行,您都可以确定该值是什么。

在这种情况下,它将是

0+0+0+0+0+0+0+0+0+(65535)*log(10)

相当多的人。但是如果你使用了另一个表达式

p = re.compile('.*:.*', re.DEBUG)

你得到了

max_repeat 0 65535
  any None
literal 58
max_repeat 0 65535
  any None

你的“熵”计算为log(255)* 65536 + 0 + log(255)* 65536

超过4倍......

这将是一个棘手的事情 - 特别是如果你开始添加环顾四周等等。但对于简单的表达式它可以完成 - 它应该让你有一种感觉,哪个是'最佳'表达。

查看像RegexBuddy这样的工具的输出会更好,它会将其正则表达式引擎的内部工作转换为“可理解的”输出 - 您可以准确地看到它正在做什么/尝试,以及如何它最终得出了它的匹配。采取这种方法将是理想的,但它是Herculean。