我从科学文献中提取了一系列表格,这些表格由列组成,每列都是不同的类型.这是一个例子
我希望能够为每列自动生成正则表达式.显然有一些简单的解决方案,.*所以我会添加他们只使用的约束:
[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}
Run Code Online (Sandbox Code Playgroud)
当然,如果我们移出地理区域,第四个正则表达式会破裂,但软件不知道这一点.目的是收集许多正则表达式,比如说"坐标"并概括它们,可能是部分手动的.仅当存在少量不同的字符串时才会创建枚举.
我很感激能够做到这一点的(特别是F/OSS)软件的例子,特别是在Java中.(它类似于Google的Refine).我4年前就知道这个问题了,但这并没有真正回答问题和text2re网站似乎是互动的.
注意:我注意到投票结束为"过于本地化".这是一个非常普遍的问题(给出的表只是一个例子),正如Google/Freebase开发的Refine解决这个问题所示.它可能涉及各种各样的表格(例如财务,新闻等).这是一个浮点值:

自动确定某些权威机构报告实际年龄(例如,不是几个月,几天)并使用2位数的精确度将是有用的.
您的特定问题是“演示编程”的特殊情况。也就是说,给定一堆输入/输出示例,您想要生成一个程序。对于您来说,输入是字符串,输出是每个字符串是否属于给定列。最后,您希望用您提出的有限正则表达式语言生成一个程序。
这种通过演示进行编程的特殊实例似乎与 MSR 最近的一个项目Flash Fill密切相关。在那里,他们不是生成正则表达式来匹配数据,而是自动生成程序来根据输入/输出示例转换字符串数据。
我只浏览了他们的一篇论文,但我会尽力在这里阐述我的理解。
本文基本上有两个重要的见解。第一个是设计一种小型编程语言来表示字符串转换。即使使用完整的正则表达式也会产生太多的可能性来快速搜索。他们设计了自己的抽象语言来操作字符串;然而,您的约束(例如仅使用简单的量词)可能会发挥与他们的自定义语言相同的作用。这在很大程度上是可能的,因为您的特定问题的范围比他们的要小一些。
第二个见解是如何在这种抽象语言中实际找到与给定输入/输出对匹配的程序。我的理解是,这里的关键思想是使用一种称为版本空间代数的技术。关于版本空间代数的粗略想法是,维护可能程序的空间的表示,并通过引入附加约束来反复修剪它。这个过程的具体细节远远超出了我的主要兴趣,因此您最好阅读类似版本空间代数简介的内容,其中还包括一些示例代码。
他们还有一些巧妙的方法来对不同的候选程序进行排名,甚至猜测哪些输入对于已经生成的程序可能有问题。我看到了一个演示,他们生成了一个程序,但没有提供足够的输入/输出对,并且该程序实际上可以突出显示可能不正确的新输入。这种排名非常有趣,但需要一些更复杂的机器学习技术,并且可能无法立即适用于您的用例。不过可能仍然很有趣。(此外,这可能在与我链接的论文不同的论文中进行了详细介绍。)
所以,是的,长话短说,您可以通过将输入/输出示例输入基于版本空间代数的系统来生成表达式。我希望这有帮助。