作为作业的一部分(是的,我说过;因此,我们不允许import re
甚至测试),我已经实现了一种将某种正则表达式格式解析为树的方法{ {1}},其中:
r
是节点的类型r.symbol
=ε,e
或0
=终端,1
=序列,.
和|
很明显)*
是r.children
子节点的列表。此格式可以匹配的唯一字符是(0, 1, 2)
,0
,因此这些也是唯一可能的终端。
1
我的实现方法是,如果匹配正则表达式,则从左侧一个字符列表和弹出字符。到目前为止,我已经匹配了大多数测试用例,但是有一些特定类型的正则表达式失败了。我知道我还没有完成,所以这是我的问题:
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
。它看起来不像做*
循环是最好的方法。while
替代运营商如何实际运作?我目前已实现它,如果两者匹配,则返回更长的匹配。答案 0 :(得分:0)
当然可以直接这样做,但是很难说正确性。 常见的方法是首先将正则表达式转换为有限状态机(无论您喜欢什么样的表示形式),然后在该有限状态机上模拟输入。
答案 1 :(得分:0)