7

我正在编写一个 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”,并挑选出被跳过的内容。
  • 以另一种方式,我正在寻找一个对模式不那么严格的模糊(又名近似)正则表达式,仍然提供良好的 oldgroupdict()以及“模糊”值(或“编辑距离”,需要确定“字符串的最佳匹配模式”稍后)。
    这是首选的解决方案,因为如果管理得当,它可以提供“足够的” groupdict()
    但是,发现是最接近的解决方案的 TRE 库和 REGEX 库似乎没有提供“模糊性”值。如果能解决这个问题,那就更好了!

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

更新:

我最终决定使用强大的正则表达式模块,但仍然无法获得“模糊值”。

由于页面上的问题在理论上已解决,因此附加太多将是不光彩的。所以我对这个新问题提出了另一个问题,希望你能解决它!

4

2 回答 2

1

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

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

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

于 2013-06-10T04:54:55.393 回答
0

DAT 正则表达式 O_O

(?i)(?:(?:my|ym).?|.?(?:my|ym))\s+(?:.?(?:..me|n..e|na..) |(?:..me|n..e|na..).?)\s+(?:(?:is|si).?|.?(?:is|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

于 2013-06-10T09:11:58.063 回答