如何实现简化的正则表达式匹配器?

时间:2013-10-23 04:02:38

标签: python regex

作为作业的一部分(是的,我说过;因此,我们不允许import re甚至测试),我已经实现了一种将某种正则表达式格式解析为树的方法{ {1}},其中:

  • r是节点的类型
    r.symbol =ε,e0 =终端,1 =序列,.|很明显)
  • *r.children子节点的列表。

此格式可以匹配的唯一字符是(0, 1, 2)0,因此这些也是唯一可能的终端。

1

我的实现方法是,如果匹配正则表达式,则从左侧一个字符列表和弹出字符。到目前为止,我已经匹配了大多数测试用例,但是有一些特定类型的正则表达式失败了。我知道我还没有完成,所以这是我的问题:

  1. 我似乎无法正确实施Kleene星def match(r, s): """ Return True iff the list of characters `s' matches the regular expression stored in `r'. """ if r.symbol == 'e': return True elif r.symbol in '01': return r.symbol == s.pop(0) if len(s) > 0 else False elif r.symbol == '.': return match(r.children[0], s) and match(r.children[1], s) elif r.symbol == '|': sl, sr = s.copy(), s.copy() kl, kr = match(r.children[0], sl), match(r.children[1], sr) if kl or kr: s = (sl if kl else sr) if kl != kr else \ (sl if len(sl) < len(sr) else sr) return True return False elif r.symbol == '*': while match(r.children[0], s): pass return True 。它看起来不像做*循环是最好的方法。
  2. while替代运营商如何实际运作?我目前已实现它,如果两者匹配,则返回更长的匹配。

2 个答案:

答案 0 :(得分:0)

当然可以直接这样做,但是很难说正确性。 常见的方法是首先将正则表达式转换为有限状态机(无论您喜欢什么样的表示形式),然后在该有限状态机上模拟输入。

答案 1 :(得分:0)

我建议使用有限状态机,因为只使用基本操作应该很容易。

这篇文章展示了如何将基本正则表达式操作实现为NFA:

Regular expressions