有没有办法在 Julia 中进行模糊正则表达式匹配?
我构建了以下正则表达式测试:
toMatch = Regex(word,"i")
ismatch(toMatch,input_string)
我希望能够进行此测试,但允许匹配中有一定的自由度,并通过编辑距离来指定这一点。
我找到了 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)))
它的作用大致是:
nfcl
通过去除重音符号、忽略大小写和执行 unicode 标准化,标准化具有类似“人类”外观的字符串。这对于模糊匹配非常有用:
julia> nfcl("Ce texte est en français.")
"ce texte est en francais."
nopunct
去除标点符号,进一步简化字符串。
julia> nopunct("Hello, World!")
"Hello World"
canonicalize
只是结合了这两种转换。
然后我们检查干草堆中的任何单词(被空格分割)是否在针的 n
范围内。
示例:
julia> fuzzy("Robert", "My name is robrt.", 2)
true
julia> fuzzy("Robert", "My name is john.", 2)
false
这绝不是一个完整的解决方案,但它涵盖了许多常见用例。对于更高级的用例,您应该查看 the subject更深入。
关于julia - Julia 中的模糊正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933471/