我希望能够为每列自动生成正则表达式.显然有一些简单的解决方案,如.*所以我会添加他们只使用的约束:
> [A-Z] [a-z] [0-9]
>明确的标点符号(例如’,’,”’)
>“简单”量词(例如{3,4}
上表的“最佳”答案是:
[A-Z]{3} [A-Za-z\s\.]+ \d{4}\sm \d{2}\u00b0\d{2}'\d{2}"N,\d{2}\u00b0\d{2}'\d{2}"E (speciosissima|intermediate|troglodytes) (hf|sr) \d{4}
当然,如果我们移出地理区域,第四个正则表达式会破裂,但软件不知道这一点.目的是收集许多正则表达式,比如说“坐标”并概括它们,可能是部分手动的.仅当存在少量不同的字符串时才会创建枚举.
我很感激能够做到这一点的(特别是F / OSS)软件的例子,特别是在Java中. (它类似于Google的Refine).我知道this question 4 years ago,但这并没有真正回答问题和text2re网站似乎是互动的.
注意:我注意到投票结束为“过于本地化”.这是一个非常普遍的问题(给出的表只是一个例子),正如Google / Freebase开发的Refine解决这个问题所示.它可能涉及各种各样的表格(例如财务,新闻等).这是一个浮点值:
自动确定一些权威机构报告实际年龄(例如不是几个月,几天)并使用2位数的精确度将是有用的.
这个通过演示编程的特殊实例似乎与MSR最近的一个项目Flash Fill密切相关.在那里,它们不是生成正则表达式来匹配数据,而是自动生成程序以根据输入/输出示例转换字符串数据.
我只是浏览了他们论文的one,但我会尝试在这里列出我理解的内容.
本文基本上有两个重要的见解.首先是设计一种小型编程语言来表示字符串转换.即使使用全开式正则表达式也会创建太多可能快速搜索的可能性.他们设计了自己的抽象语言来操纵字符串;但是,您的约束(例如,仅使用简单的量词)可能会扮演与其自定义语言相同的角色.这在很大程度上是可能的,因为您的特定问题的范围比他们的要小一些.
第二个见解是关于如何在这种抽象语言中实际找到与给定输入/输出对匹配的程序.我的理解是这里的关键思想是使用一种名为version space algebra的技术.关于版本空间代数的粗略想法是你保持可能程序空间的表示,并通过引入额外的约束来反复修剪它.这个过程的确切细节远远超出了我的主要兴趣,所以你最好阅读像introduction to version space algebra这样的东西,其中包括一些示例代码.
他们还有一些聪明的方法来排列不同的候选程序,甚至猜测哪些输入可能对已经生成的程序有问题.我看到了一个演示,他们生成了一个程序而没有给它足够的输入/输出对,程序实际上可以突出显示可能不正确的新输入.这种排名非常有趣,但需要一些更复杂的机器学习技术,可能不会立即适用于您的用例.可能仍然很有趣. (此外,这可能在与我链接的文章不同的文章中详细说明.)