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