【发布时间】:2011-10-06 11:18:39
【问题描述】:
我们已经编写了系统来分析来自大型网络的日志消息。系统从许多不同的网络元素中获取日志消息,并通过正则表达式对其进行分析。例如用户可能写了两条规则:
^cron/script\.sh.*
.*script\.sh [0-9]+$
在这种情况下,只会选择与给定模式匹配的日志。过滤的原因是日志消息可能真的很多,每天最多 1 GB。
现在是我问题的主要部分。由于有很多网络元素,并且它们有几种类型,并且它们中的每一个在路径中都有不同的参数......有没有办法自动生成一组正则表达式,以某种方式对日志进行分组?该系统可以学习历史数据,例如从上周开始。生成的正则表达式一定不是很准确,应该是提示用户将这样的新规则添加到系统中。
我正在考虑使用无监督机器学习将输入分组,然后在每个组中找到合适的正则表达式。有没有其他方法,也许更快或更好?最后但同样重要的是,如何找到匹配所获得组中所有字符串的正则表达式? (重要的是,.* 不是答案。)
编辑经过一番思考,我将尝试简化问题。假设我已经对日志进行了分组。我想(最多)找到三个最大的子字符串(至少一个),这些子字符串对集合中的所有字符串都是通用的。例如:
Set of strings:
cron/script1.sh -abc 1243 all
cron/script2.sh 1
bin/script1.sh -asdf 15
Obtained groups:
/script
.sh
现在我可以通过将这些组与.*? 连接起来来构建一些简单的正则表达式。在此示例中,它将是 .*?(/script).*?(\.sh ).*?。这似乎是更简单的解决方案。
【问题讨论】:
-
棘手的问题。考虑到由一位领先的正则表达式专家为此目的编写的工具仍然需要大量用户交互,这可能非常重要:参见regexmagic.com
-
有一个简单的证明,对于任何有限的字符串集,都有无限数量的正则表达式可以匹配它们,所以是的,它是不平凡的任务。跨度>
-
我相信可能有一些启发式方法可以找到正则表达式。它不必是完整的正则表达式;我认为只需找到一组常见的子字符串,然后将它们与
.*?连接起来就足够了。 -
这个问题没有很好的定义。匹配词 w1、w2、...、wN 限制性最强的正则表达式是 w1 + w2 + ... + wN,限制性最小的是 E*。你想要一个在中间?任君挑选。