julia中的模糊正则匹配

julia中的模糊正则匹配,julia,fuzzy-comparison,Julia,Fuzzy Comparison,有没有办法在Julia中进行模糊正则表达式匹配 我构建了以下正则表达式测试: toMatch = Regex(word,"i") ismatch(toMatch,input_string) 我希望能够进行此测试,但允许在匹配中使用一些纬度,并通过Levenshtein距离指定 我已经找到了包Levenshtein,它可以计算距离,但不确定如何将它合并到这个逻辑中。例如: levenshtein("hello","hllo")` > 1 (这个答案与正则表达式无关,但它涵盖了一些用例。)

有没有办法在Julia中进行模糊正则表达式匹配

我构建了以下正则表达式测试:

toMatch = Regex(word,"i")
ismatch(toMatch,input_string)
我希望能够进行此测试,但允许在匹配中使用一些纬度,并通过Levenshtein距离指定

我已经找到了包Levenshtein,它可以计算距离,但不确定如何将它合并到这个逻辑中。例如:

levenshtein("hello","hllo")`
> 1
(这个答案与正则表达式无关,但它涵盖了一些用例。)

我不知道这是否适用于您的用例。但是,看起来您正在尝试查找文本中是否存在单词(或拼写错误)。如果文本由空格分隔,并且您的单词不包含空格,您可以尝试以下操作:

nopunct(s) = filter(c -> !ispunct(c), s)
nfcl(s) = normalize_string(s, decompose=true, compat=true, casefold=true,
                              stripmark=true, stripignore=true)
canonicalize(s) = nopunct(nfcl(s))
fuzzy(needle, haystack, n) = any(
    w -> levenshtein(w, canonicalize(needle)) < n,
    split(canonicalize(haystack)))
nopunc
去除标点符号,进一步简化字符串

julia> nopunct("Hello, World!")
"Hello World"
规范化
只是将这两种转换结合起来

然后我们检查草堆中的任何单词(由空格分割)是否在针的
n
范围内

示例:

julia> fuzzy("Robert", "My name is robrt.", 2)
true

julia> fuzzy("Robert", "My name is john.", 2)
false

这决不是一个完整的解决方案,但它涵盖了许多常见用例。对于更高级的用例,您应该更深入地研究。

这里需要正则表达式吗?这听起来像是一般正则表达式的一个困难(计算)问题。我可能不需要它。我首先使用这里列出的代码解决了精确匹配的问题,现在我尝试允许接受输入字符串中的拼写错误。这非常有用,但是,在我的情况下,我试图在文本中找到的单词可能有空格,因为它可能是一个短语。如果针是一个普通的旧字符串(没有像
*
()
这样的正则表达式字符),有一个“技巧”你可以做:计算
levenshtein(针,干草堆)
,检查它是否小于
长度(干草堆)-长度(针)+n
。(至少
length(haystack)-length(pine)
必须删除字符才能从haystack到达针,然后可能会执行
n
进一步的操作。)无论针中有什么字符,这都有效。我认为这将非常适合我的需要。我要添加的一个修改是根据针的长度稍微改变
n
。谢谢@FengyangWang@亚伦,打得好。我个人使用了
fuzzy(针、草堆、圆形(Int、长度(针)*(3/4))
julia> fuzzy("Robert", "My name is robrt.", 2)
true

julia> fuzzy("Robert", "My name is john.", 2)
false