我有一个字符串列表和一个正则表达列表。我的目标是为每个字符串找到匹配的正则表达式。当然,有时列表中的多个正则表达式将匹配给定的字符串。在这种情况下,我想要一些方法对它们进行排名。
基本上,可以奖励静态零件匹配或更紧凑的东西。例如,假设我的正则表达式是.*:.*
和STARTING:\d+
,而我的字符串是STARTING:18
,那么显然我更加相信第二个正则表达式是更好的匹配,因为它匹配静态内容并预测最后的字符将是数字,而不仅仅是任何内容。
我不确定我是否会看到整体算法会如何发展,以及我是否描述了真正的质量(更紧密的匹配),或者它是否会归结为某种启发式'得分'我' d必须分配给每场比赛。
如果有任何不同,我在python中工作。
答案 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。