Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为字符串列表创建正则表达式_Regex - Fatal编程技术网

Regex 为字符串列表创建正则表达式

Regex 为字符串列表创建正则表达式,regex,Regex,我从科学文献中提取了一系列表格,这些表格由不同类型的列组成。这里有一个例子 我希望能够为每一列自动生成正则表达式。显然有一些简单的解决方案,如*,因此我将添加它们仅使用的约束: [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 (speciosissi

我从科学文献中提取了一系列表格,这些表格由不同类型的列组成。这里有一个例子

我希望能够为每一列自动生成正则表达式。显然有一些简单的解决方案,如
*
,因此我将添加它们仅使用的约束:

  • [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)。我知道,但这并没有真正回答这个问题,这个网站似乎是交互式的

注:我注意到投票结果为“过于本地化”。这是一个非常普遍的问题(给出的表格只是一个示例),正如Google/Freebase开发Refine解决该问题所示。它可能涉及非常广泛的表格(如金融、新闻等)。以下是一个带有浮点值的表格:


自动确定某些机构以实数(例如,不是月、日)报告年龄并使用2位精度是有用的。

您的特定问题是“演示编程”的特例。也就是说,给定一组输入/输出示例,您希望生成一个程序。对于您来说,输入是字符串,输出是每个字符串是否属于给定列。最后,您希望以您提出的有限正则表达式语言生成一个程序

这个演示编程的特殊实例似乎与MSR最近的一个项目密切相关。在那里,他们没有生成正则表达式来匹配数据,而是根据输入/输出示例自动生成程序来转换字符串数据

我只是浏览了一下他们的论文,但我会尽量把我所理解的放在这里

本文主要有两个重要的见解。第一个是设计一种小型编程语言来表示字符串转换。即使使用完全正则表达式也会产生太多的可能性,无法快速搜索。他们设计了自己的抽象语言来处理字符串;但是,您的约束(例如,仅使用简单的量词)可能与他们的自定义语言起到相同的作用。这在很大程度上是可能的,因为您的特定问题的范围比他们的小一些

第二个洞察是如何在这种抽象语言中找到与给定输入/输出对匹配的程序。我的理解是,这里的关键思想是使用一种称为的技术。关于版本空间代数的粗略想法是,维护可能程序的空间表示,并通过引入重复修剪它这一过程的具体细节远远超出了我的主要兴趣范围,因此您最好阅读类似的内容,其中还包括一些示例代码

他们也有一些聪明的方法对不同的候选程序进行排序,甚至猜测对于已经生成的程序来说哪些输入可能有问题。我看到了一个演示,他们在没有给出足够的输入/输出对的情况下生成了一个程序,而该程序实际上可以突出显示可能不正确的新输入。这种排名非常有趣,但需要一些更复杂的机器学习技术,并且可能不会立即适用于您的用例。不过可能仍然很有趣。(此外,这可能在与我链接的论文不同的论文中详细介绍。)

是的,长话短说,通过将输入/输出示例输入到基于版本空间代数的系统中,您可以生成表达式。我希望这会有所帮助。

我自己的方法(我已经部分原型化了)是启发性的,并且基于这样一个前提:给定的列通常会有相同或相似的字符长度和标点符号。我欢迎评论(生成的代码将是开源的)

  • [A-Z]
    展平到
    'A'
  • [a-z]
    展平到
    'a'
  • [0-9]
    展平到
    '0'
  • 将任何其他特殊码点集(如希腊字符)展平为单个字符(如alpha)
  • 然后,列变为:

  • “AAA”
  • “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  • “0000 a”
  • “00\u00b000'00”N,00\u00b000'00”E
  • “0000”
  • 然后,我将用正则表达式替换这些表达式,例如

  • “([A-Z])([A-Z])([A-Z])”
  • “(\d)(\d)(\d)(\d)\s([0-9])”
  • 并将单个字符捕获到集合中。这将显示(比如)在3中。最后的字符总是
    “m”
    ,因此
    \d\d\d\s[m]
    和7。值是
    [2][0][0][458]

    对于不适合此模型的列,我们使用
    “(.*)”
    进行搜索,并查看是否可以使用启发式方法创建有用的集(第5列和第6列),例如“至少2个多字符串,不超过50%的唯一字符串”


    通过使用动态编程(参见Kruskal),我希望能够对齐类似的正则表达式,这至少对我有用!

    我目前正在研究相同的(或类似的东西)()。一般来说,这称为