Regex 自动构建适合字符串集的正则表达式

Regex 自动构建适合字符串集的正则表达式,regex,string,algorithm,Regex,String,Algorithm,我们编写了一个系统来分析来自大型网络的日志消息。该系统从许多不同的网络元素中获取日志消息,并通过正则表达式对其进行分析。例如,用户可能编写了两条规则: ^cron/script\.sh.* .*script\.sh [0-9]+$ 在这种情况下,将只选择与给定模式匹配的日志。过滤的原因是可能有很多日志消息,每天高达1 GB 现在是我问题的主要部分。由于网络元素很多,并且有几种类型,而且每种元素的路径参数都不同,所以。。。有没有办法自动生成一组正则表达式,以某种方式对日志进行分组?系统可以学习历

我们编写了一个系统来分析来自大型网络的日志消息。该系统从许多不同的网络元素中获取日志消息,并通过正则表达式对其进行分析。例如,用户可能编写了两条规则:

^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)。*?
。这似乎是一个更简单的解决方案。

好的,我们将尝试将其分解为可管理的步骤

1。对于s1中的每个子串w,按不增加长度的顺序,
2.假设w是另一个sM的子字符串
3.对于其他序列号的每个字符串,
4.如果w不是sN的子串,则反驳假设并中断
5.如果假设成立,则保存w
6.如果你找到了三个工作的w,休息一下
7.您已记录了0到3 w之间的工作。
请注意,并非所有字符串集都保证有公共子字符串(空字符串除外)。在最坏的情况下,假设s1是最长的字符串。s1(| s1 |=n)有O(n^2)个子字符串,需要O(n)与m个其他字符串中的每一个进行比较。。。所以渐近复杂性,我相信是O(n^2*nm)。。。尽管算法很幼稚,但这应该是很容易管理的(毕竟是多项式的,而且是二次的)

转换为例如C代码应该很简单。。。使用具有递减长度循环的滑动窗口来获取s1的子字符串,然后使用线性搜索器在其他字符串中查找匹配项


我相信有更聪明/渐进更好的方法来实现这一点,但任何算法都必须查看所有字符串中的所有字符,所以O(nm)。。。在这里可能不完全正确。

在我看来,您试图做一些regex无法做到的事情。正则表达式从其输入识别令牌,仅此而已。由程序的其余部分来确定输入来自何处、如何分组以及如何处理所获得的令牌

所以,让我们从头开始。您有一个由来自不同网络位置的日志事件组成的输入流。对此进行抽象,我们得到一个文本流。有关如何使用python以简化方式执行此操作的示例,请参见

现在我们有了文本,我们想把它分成逻辑组。这就是你的正则表达式的用途,尽管我们真的应该使用一个成熟的lexer。这些标记进入代码的解析器部分

解析器决定如何处理我们收集的令牌。现在是我们分析它们的时候了,先做些简单的事情。例如,将每个唯一的“名称”标记添加到列表中,并带有发生次数。如果这个数字大于50,我们输出令牌

我已经掩盖了这里的细节。首先,您必须确定标记化的“语言”。例如,如果您有这样的日志字符串:
ipOfComputer/full/path/to/script.sh args
,那么您的标记化需要理解这些位


阅读这本书,对所涉及的各种主题进行极好的介绍。请注意,这将独立于您的用户regex位。这也会发生在整个流上,做它自己的事情。此程序的输出将成为简单的正则表达式,以添加到配置文件中。

您可以尝试此站点上托管的工具:

这个工具会根据一组示例自动生成正则表达式,因此它应该非常适合您的用例。
网站上还详细介绍了它的工作原理(它基于基因编程)。

棘手的问题。鉴于正则表达式领域的一位顶尖专家为此目的编写的工具仍然需要大量的用户交互,这可能非常重要:有一个简单的证据表明,对于任何有限的字符串集,都有无穷多的正则表达式与之匹配,是的,这是一项不平凡的任务。我相信可能会有一些启发,可以找到正则表达式。它不必是完全正则表达式;我认为只要找到一组公共子字符串,然后用
*?
将它们连接起来就足够了。这个问题没有很好的定义。匹配单词w1,w2,…,wN的最严格正则表达式是w1+w2+…+wN,限制性最小的是E*。你想要中间的吗?有你的选择。可能重复的