可以“跳过”的模糊字符串匹配?例如“我是 (。*)。”与“我在这儿”的距离为0。

时间:2013-06-10 04:36:31

标签: regex levenshtein-distance fuzzy-search

我正在写一个Python聊天机器人。无论技术是什么(Levenshtein,LCS,正则表达式等),我都希望像My name is [ A ].这样的模式足够智能匹配以下字符串:

My name is Tslmy.              #Distance should = 0, and groupdict()['a'] outputs "Tslmy"
My name is Tesla Tahomana.     #Distance should = 0(!), and groupdict()['a'] outputs "Tesla Tahomana"
my  naem ist tslmy .           #With a little typo, the distance = 5, and groupdict()['a'] outputs "tslmy "

请允许我使用groupdict()['a']来引用[ A ]事物(实际上(?P<identifier>match))已捕获的内容。

  • 换句话说,我正在寻找一个带有省略/跳过/空白/疏忽的“Levenshtein”,并且选择已被跳过的内容
  • 换句话说,我正在寻找一个模糊(也就是近似)的正则表达式,它可以对模式不那么严格,仍然提供好的旧 groupdict() ,以及“模糊”值(或“编辑距离”,以后确定“与字符串匹配的最佳模式”所需)。
    这是首选解决方案,因为如果管理得当,它会提供“足够的”groupdict() 然而,TRE库和REGEX库被发现是最接近的解决方案,似乎没有提供“模糊”值。如果这可以解决,那就更好了!

这可能吗?感谢您的关注。

更新

我最终决定使用功能强大的regex模块,但仍然无法获得“模糊值”。

由于这个页面上的问题是理论上解决的,所以进一步追加将是不光彩的。所以我提出another question about this new issue,希望你能解决它!

2 个答案:

答案 0 :(得分:1)

您可以使用RegEx进行基本匹配:

r"My name is (\w+){1,2}."

然后使用TRE库来允许变体。

答案 1 :(得分:0)

DAT REGEX O_O

  

(我?)(?:我| | YM))\ S +((:( ?:我| YM):。?。?(?:?..我| n..e |呐..)|(?:????..我| n..e |呐..))\ S +(:( ?:是| SI)|(?:是| SI))\ S + (\ W [\ W \ S] )\ S

让我们将其分开:

  • (?i):设置i修饰符以匹配不区分大小写的
  • (?:(?:my|ym).?|.?(?:my|ym)):这将匹配my, ym, My, Ym, may, amy etc...
  • \s+:匹配空格一次或多次
  • (?:.?(?:..am|n..e|na..)|(?:..am|n..e|na..).?):匹配name, naao, tame, lame, n99e, names, Naats etc...
  • \s+:匹配空格一次或多次
  • (?:(?:is|si).?|.?(?:is|si)):匹配is, si, ist, sit, siR etc...
  • \s+:匹配空格一次或多次
  • (\w[\w\s]*):匹配单词和空格一次或多次并对其进行分组(必须以单词\w开头)
  • \s*:匹配空格零次或多次

Online demo