Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 与正则表达式最接近的字符串匹配_Regex_Fuzzy Search - Fatal编程技术网

Regex 与正则表达式最接近的字符串匹配

Regex 与正则表达式最接近的字符串匹配,regex,fuzzy-search,Regex,Fuzzy Search,除了正则表达式/有限自动机之外,有没有一种方法可以根据正则表达式将输入单词与最接近的可接受单词进行匹配,有点像拼写检查/Google的“你是说:x吗?”?有什么具体的算法吗 编辑:用Java编程,但我更感兴趣的是是否有任何用于此目的的算法。您可能可以使用。它计算两个单词的差异/接近度 作为一个代码示例,Python提供了一个方法,您可以传递一个字符串和一个字符串列表,它将返回良好的匹配字符串。 因此,您可能希望(从数据库/文件中)获得一个与您的单词以相同字母开头的单词列表,然后检查它们是否接近。

除了正则表达式/有限自动机之外,有没有一种方法可以根据正则表达式将输入单词与最接近的可接受单词进行匹配,有点像拼写检查/Google的“你是说:x吗?”?有什么具体的算法吗


编辑:用Java编程,但我更感兴趣的是是否有任何用于此目的的算法。

您可能可以使用。它计算两个单词的差异/接近度

作为一个代码示例,Python提供了一个方法,您可以传递一个字符串和一个字符串列表,它将返回良好的匹配字符串。 因此,您可能希望(从数据库/文件中)获得一个与您的单词以相同字母开头的单词列表,然后检查它们是否接近。
这是否符合您感兴趣的方向?

一般来说,不是。正则表达式是精确的匹配机制。你要找的更多的是模糊匹配

现在,可以构造正则表达式来匹配多个备选方案。其中一些备选方案可能代表常见的拼写错误。例如:

r'potatoe?s?' 
将匹配
马铃薯
马铃薯
马铃薯
,以及
马铃薯
。但是,构建所有可能的、不完全正确的组合既费力又容易出错

通常,最好使用模糊匹配算法来判断输入术语与所有已知/适当术语列表的“接近程度”。例如,在Python中,您可以安装并使用模块,该模块使用以下方法计算“亲密度”:

<>你可以调整你想要的阈值,在这个阈值中,你想确定“不足以考虑它是可纠正的”。 更新


对difflib.get_close_matches(单词,可能性[,n][,截止])提出了很好的建议。。它的优点是作为标准库的一部分。当然,如果您使用的是另一种语言,您需要探索该特定语言的“查找紧密匹配”库。

您对什么编程语言感兴趣?Java,但我更感兴趣的是,如果有任何实际的算法可以做到这一点,或者伪代码也可以。是的,我也在考虑用Levenshtein距离以这种方式实现它,在最坏的情况下,如果没有现有的算法来完成这项工作,因为列出所有单词,然后比较它们似乎有点耗时。。。
from fuzzywuzzy import process

commands = ["open", "close", "run", "debug", "help" ]

for word in ["open", "closer", "runt", "defung", "xlkjs"]:
    choice, score = process.extractOne(word, commands)
    if score < 70:
        print "don't understand {0!r} {1}".format(word, score)
    else:
        print "correcting {0!r} to {1!r} (score {2})".format(word, choice, score)
correcting 'open' to 'open' (score 100)
correcting 'closer' to 'close' (score 91)
correcting 'runt' to 'run' (score 86)
correcting 'defung' to 'debug' (score 73)
don't understand 'xlkjs' 40