我有以下tokenizeAndParse(s)函数,它接受一个字符串并尝试将其标记为一个字符串数组
def tokenizeAndParse(s):
tokens = re.split(r"(\s+|assign|:=|print|\+|if|while|{|}|;|[|]|,|@|for|true|false|call|procedure|not|and|or|\(|\))", s)
tokens = [t for t in tokens if not t.isspace() and not t == ""]
print("hello",tokens)
功能的一些例子
tokenizeAndParse("assign abc := [true, true, true];")
hello ['assign', 'abc', ':=', '[', 'true', ',', 'true', ',', 'true', ']', ';']
tokenizeAndParse("print 5+5;")
hello ['print', '5', '+', '5', ';']
我遇到了一个有趣的问题,如果我调用以下内容, 4 和] 不会被解析为单独的令牌,我不知道为什么。如上所示,如果在] 之前 true ,则该功能正常工作。
tokenizeAndParse("assign abc := [true, true, 4];")
hello ['assign', 'abc', ':=', '[', 'true', ',', 'true', ',', '4]', ';']
进一步使用该函数演示如果它是] 之前的数字,它将无法正确解析。这是怎么回事?
答案 0 :(得分:1)
原因是你没有分数。替换下面的代码行:
tokens = re.split(r"(\s+|assign|:=|print|\+|if|while|{|}|;|[|]|,|@|for|true|false|call|procedure|not|and|or|\(|\))", s)
如下图所示:
>>> def tokenizeAndParse(s):
tokens = re.split(r"(\s+|assign|:=|print|\+|if|while|{|}|;|[|]|,|@|for|true|false|call|procedure|not|and|or|\(|\)|[0-9]+)", s)
tokens = [t for t in tokens if not t.isspace() and not t == ""]
print("hello",tokens)
>>> tokenizeAndParse("assign abc := [true, true, 4];")
('hello', ['assign', 'abc', ':=', '[', 'true', ',', 'true', ',', '4', ']', ';'])
这将解决问题。