Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 从samples算法创建正则表达式_Regex_Algorithm_Pattern Matching - Fatal编程技术网

Regex 从samples算法创建正则表达式

Regex 从samples算法创建正则表达式,regex,algorithm,pattern-matching,Regex,Algorithm,Pattern Matching,AFAIK没有人实现一种算法,该算法接受一组字符串和子字符串,并返回一个或多个正则表达式,这些正则表达式将匹配字符串中给定的子字符串。例如,如果我给我的算法两个样本: string1 = "fwef 1234 asdfd" substring1 = "1234" string2 = "asdf456fsdf" substring2 = "456" 该算法将返回正则表达式“[0-9]*”。我知道它可能会返回不止一个正则表达式,甚至不可能返回任何正则表达式,您可能会发现1000个原因,说明这种算

AFAIK没有人实现一种算法,该算法接受一组字符串和子字符串,并返回一个或多个正则表达式,这些正则表达式将匹配字符串中给定的子字符串。例如,如果我给我的算法两个样本:

string1 = "fwef 1234 asdfd"
substring1 = "1234"

string2 = "asdf456fsdf"
substring2 = "456"
该算法将返回正则表达式“[0-9]*”。我知道它可能会返回不止一个正则表达式,甚至不可能返回任何正则表达式,您可能会发现1000个原因,说明这种算法几乎不可能实现到完美。但最接近的是什么


我也不太在乎正则表达式本身。基本上,我想要的是一种算法,它将样本作为上面的样本,然后在其中找到一种模式,可以轻松地找到“种类”我想在一个字符串中找到一个文本,而不必手动编写任何正则表达式或代码。

我没有证据,但我怀疑不可能存在这样的有限输出的离散算法,因为您要求创建一种规则语言,它的输入大小可能“很大”

有了这些,我建议您看看哪些可以逐个分解示例文本并帮助您构建正则表达式。

给您:

re = '|'.join(substrings)
如果您想要更一般的方法,那么您的算法将不得不对哪种类型的字符串可以作为匹配项进行有根据的猜测,并且要证明没有一个过程能够在不简单地枚举它们的情况下解释所有可能的输入集,这是很简单的。例如,考虑其中的一些场景:

  • 匹配所有素数
  • 匹配十六进制字符串,但示例集中没有包含“f”的字符串
  • 匹配重复两次的相同字符串
  • 匹配任意偶数长度的字符串

根本问题是您的问题没有完全指定。如果您有一个更具体的需求,这可能是可以解决的,这取决于它是什么。

事实上有很多这样的算法。这是一个叫做“语法推理”的研究领域

例如,我知道RPNI。(您还可以查看概率分支,alergia、MDI、DEES)。这些算法生成DSA(确定性状态自动机)。事实上,您完全不需要在示例中输入字符串。只有子字符串

也有一些直接生成非确定性自动机的算法

当然,从非确定性自动机获取正则表达式很容易

主要思想很简单:

从示例生成PTSA(前缀树状态自动机)


然后,你必须尝试“合并”一些州。从这些合并中,将出现循环(即正则表达式中的*)。所有的困难在于选择正确的合并规则。

FlashFill MS Excel 2013的一个新功能将完全完成您想要的任务,但它不会为您提供正则表达式。这是一个NP完全问题,也是一个实际问题。如果您对如何从多个示例中综合字符串操作感兴趣,请阅读几篇文章。他们有伪代码和演示。电影也一样。

什么能阻止算法仅仅产生一个正则表达式,它是所有可能的子字符串的“或”?或者你会对这个正则表达式的产生感到满意吗?那将是有史以来最愚蠢的算法。我只会以这样一种方式编程,它不会这样做,但会试图找出我真正想要的。我知道这很混乱。或者这可能只是众多输出之一。实际上,这个算法可以通过测试所有可能的正则表达式并输出有效的正则表达式来构建。可能需要一段时间,但我认为这证明了这种算法是可行的。事实上,对于简单的模式可能不会花那么长时间。我可能会尝试类似的东西。“我真正想要的”不是计算机擅长的东西。有无限多的正则表达式产生一组特定的输出,这就是为什么你的问题定义得不好的部分原因。我知道你在寻找什么-我知道这是不切实际的,因为你的问题定义得不好。事实上,有无限多个正则表达式与您提供的一组字符串相匹配,算法无法确定哪一个更优。至少这证明了我想要的是一个算法,并反驳了大多数其他答案的说法。我确信excel在内部使用了某种正则表达式,或者如果没有其他东西,可以转换成正则表达式。可以匹配素数的正则表达式是什么样子的?