将2个列表与通配符匹配的算法

Joe*_*ett 5 python string algorithm pattern-matching string-matching

我正在寻找一种匹配2个列表的有效方法,一个包含完整信息,另一个包含通配符.我已经能够使用固定长度的通配符来做到这一点,但我现在正尝试使用可变长度的通配符.

从而:

match( ['A', 'B', '*', 'D'], ['A', 'B', 'C', 'C', 'C', 'D'] )
Run Code Online (Sandbox Code Playgroud)

只要所有元素在两个列表中的顺序相同,它就会返回True.

我正在使用对象列表,但为了简单起见,使用了上面的字符串.

hui*_*ker 5

[编辑以证明在比较对象的OP评论后没有RE]

\n\n

看来您没有使用字符串,而是比较对象。因此,我给出了一个显式算法 \xe2\x80\x94 正则表达式为字符串提供了一个很好的解决方案,不要误会我的意思,但是从你对问题的评论来看,这似乎是一个显式的、简单的算法可能会让你的事情变得更容易。

\n\n

事实证明,这个问题可以用比之前的答案简单得多的算法来解决:

\n\n
def matcher (l1, l2):\n    if (l1 == []):\n        return (l2 == [] or l2 == [\'*\'])\n    if (l2 == [] or l2[0] == \'*\'):\n        return matcher(l2, l1)\n    if (l1[0] == \'*\'):\n        return (matcher(l1, l2[1:]) or matcher(l1[1:], l2))\n    if (l1[0] == l2[0]):\n        return matcher(l1[1:], l2[1:])\n    else:\n        return False\n
Run Code Online (Sandbox Code Playgroud)\n\n

关键思想是,当您遇到通配符时,您可以探索两个选项:

\n\n
    \n
  • 要么在包含通配符的列表中前进(并考虑通配符与迄今为止存在的任何内容相匹配)
  • \n
  • 或在不包含通配符的列表中前进(并考虑列表开头的任何内容都必须与通配符匹配)。
  • \n
\n