例如,给定字符串"2009/11/12"我想得到正则表达式("\ d {2}/d {2}/d {4}"),所以我将能够匹配"2001/01/02"也是.
有什么东西可以做到吗?相似的东西?任何想法'如何做到这一点?
我正在分析一个大型公共数据集,其中包含大量冗长的人类可读字符串,这些字符串是由一些常规(在形式语言理论意义上)语法明确生成的.
一个接一个地查看这些字符串集来查看模式并不太难; 不幸的是,大约有24,000个这些独特的字符串分为33个类别和1714个子类别,因此手动执行此操作有点痛苦.
基本上,我正在寻找一个现有的算法(最好使用现有的参考实现)来获取任意的字符串列表,并尝试推断一些可用于生成的正则表达式的最小化(对于一些合理的最小化定义)它们(即从该语法生成的语言中推导出一组有限字符串中的常规语法).
我已经考虑过重复贪婪最长的常见子串消除,但这只是到目前为止,因为除了完全匹配之外它不会崩溃,所以不会检测到,例如,在特定位置的变化数字串的常见模式语法.
暴力强迫任何不会脱离常见子串消除的东西是可能的,但可能在计算上不可行.(另外,我想过这个问题,有可能是一个"阶段排序"和/或子淘汰"当地最低"的问题,因为你可能会做出最终迫使最终语法贪婪的字符串匹配要少压缩/即使它看起来是最好的减少最小).
我提出从我们目前的业务痛点同事一个有趣的问题,并很好奇,如果有什么事,在那里(工具/库/算法),这可能有助于自动执行此.
假设您有一个文字值列表(在我们的例子中,它们是URL).我们想要做的是,根据这个列表,提出一个匹配所有这些文字项的正则表达式.
所以,如果我的列表是:
http://www.example.com
http://www.example.com/subdir
http://foo.example.com
Run Code Online (Sandbox Code Playgroud)
最简单的答案是
^(http://www.example.com|http://www.example.com/subdir|http://foo.example.com)$
Run Code Online (Sandbox Code Playgroud)
但是这对于大量数据而言变得很大,而且我们有一个长度限制,我们试图保持不变.
目前我们手动编写正则表达式,但这不能很好地扩展,也不是很好地利用任何人的时间.有没有分解源数据拿出匹配所有的源值的长度最佳的正则表达式的更自动化的方式?
是否有任何lib可以采取文本(如html文档)和字符串列表(如某些产品的名称),然后在字符串列表中找到一个模式,并生成一个正则表达式,将提取所有的文本中的字符串(html文档)与它找到的模式匹配?
例如,给定以下html:
<table>
<tr>
<td>Product 1</td>
<td>Product 2</td>
<td>Product 3</td>
<td>Product 4</td>
<td>Product 5</td>
<td>Product 6</td>
<td>Product 7</td>
<td>Product 8</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
以及以下字符串列表:
['Product 1', 'Product 2', 'Product 3']
Run Code Online (Sandbox Code Playgroud)
我想要一个可以构建如下所示的正则表达式的函数:
'<td>(.*?)</td>'
Run Code Online (Sandbox Code Playgroud)
然后从html中提取与正则表达式匹配的所有信息.在这种情况下,输出将是:
['Product 1', 'Product 2', 'Product 3', 'Product 4', 'Product 5', 'Product 6', 'Product 7', 'Product 8']
Run Code Online (Sandbox Code Playgroud)
澄清:
我希望函数能够查看样本的周围,而不是样本本身.所以,例如,如果html是:
<tr>
<td>Word</td>
<td>More words</td>
<td>101</td>
<td>-1-0-1-</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
以及['Word', 'More words']我希望它提取的样本:
['Word', 'More words', '101', '-1-0-1-']
Run Code Online (Sandbox Code Playgroud) 我们编写了系统来分析来自大型网络的日志消息.系统从许多不同的网络元素中获取日志消息,并通过正则表达式进行分析.例如,用户可能已经编写了两条规则:
^cron/script\.sh.*
.*script\.sh [0-9]+$
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只会选择与给定模式匹配的日志.过滤的原因是可能存在大量日志消息,每天最多1 GB.
现在是我问题的主要部分.因为有很多网络元素,以及它们的几种类型,并且它们中的每一个在路径中都有不同的参数...有没有办法自动生成一组以某种方式对日志进行分组的正则表达式?系统可以学习历史数据,例如从上周开始.生成的正则表达式必须非常准确,它应该是用户将这种新规则添加到系统中的提示.
我正在考虑无监督机器学习将输入分成组,然后在每组中找到正确的正则表达式.还有其他方式,可能更快或更好吗?并且,最后但并非最不重要的,如何找到匹配所有组中的所有字符串的正则表达式?(非平凡,所以.*不是答案.)
编辑经过一番思考后,我会尝试简化问题.假设我已经分组了日志.我想(最多)找到集合中所有字符串共有的三个最大子串(至少一个).例如:
Set of strings:
cron/script1.sh -abc 1243 all
cron/script2.sh 1
bin/script1.sh -asdf 15
Obtained groups:
/script
.sh
Run Code Online (Sandbox Code Playgroud)
现在我可以通过将这些组连接起来构建一些简单的正则表达式.*?.在这个例子中它将是.*?(/script).*?(\.sh ).*?.这似乎是更简单的解决方案.