正则表达式中的Levenshtein距离

时间:2012-04-10 09:39:44

标签: regex levenshtein-distance

是否有可能在正则表达式查询中包含levenshtein距离?

除了在排列之间建立联合。喜欢用L.d.搜索“你好”。 1

.ello | h.llo | he.lo | hel.o | hell.

对于大量的L.d来说,这是非常愚蠢和无法使用的。

3 个答案:

答案 0 :(得分:7)

您可以通过编程方式生成正则表达式。我将把它作为读者的练习,但是对于这个假设函数的输出(给出“word”的输入),你想要这样的字符串:

"^(?>word|wodr|wrod|owrd|word.|wor.d|wo.rd|w.ord|.word|wor.?|wo.?d|w.?rd|.?ord)$"

在英语中,首先尝试匹配单词本身,然后是每个可能的单个换位,然后是每个可能的单个插入,然后是每个可能的单个省略或替换(可以同时进行)。

给定长度为n的单词时,该字符串的长度与n呈线性关系(特别是不是指数)。

我认为这是合理的。

你将它传递给你的正则表达式生成器(就像在Ruby中它将是Regexp.new(str))和bam,你有一个匹配任何单词的匹配器,Damerau-Levenshtein距离为给定单词。

(Damerau-Levenshtein 2的距离要复杂得多。)

注意使用(?>非回溯构造,这意味着该输出中各个|'d表达式的顺序。

我想不出一种“压缩”这种表达的方法。

编辑:我得到了它,至少在Elixir! https://github.com/pmarreck/elixir-snippets/blob/master/damerau_levenshtein_distance_1.exs

我不一定会推荐这个(除了教育目的)因为它只会让你到1的距离;一个合法的D-L库可以让你计算距离> 1.虽然这是正则表达式,但一旦构造它可能会很快工作(注意你应该将“编译”的正则表达式保存在某个地方,因为这个代码当前在每次比较时重建它!)

答案 1 :(得分:5)

  

是否有可能在正则表达式查询中包含levenshtein距离?

不,不是一个理智的方式。实现 - 或使用现有的 - Levenshtein距离算法是可行的方法。

答案 2 :(得分:1)

其中有几个具有近似匹配功能的正则表达式方言-TRE库和Python的regex PyPI模块。

TRE近似匹配语法在https://laurikari.net/tre/documentation/regex-syntax/的“近似匹配设置”部分中进行了描述。与hello的Levenshtein距离1之内的内容匹配的TRE正则表达式为:

(hello){~1}

regex模块的近似匹配语法在https://pypi.org/project/regex/中以文本Approximate “fuzzy” matching开头的项目符号处进行了描述。匹配regex的Levenshtein距离1之内的内容的hello正则表达式为:

(hello){e<=1}

也许这些语法中的一种或另一种会及时被其他正则表达式实现所采用,但是目前我只知道这两种语法。