我想编写一个BinaryTree
解析器。我不知道如何解决这个问题。我尝试过递归地使用正则表达式,但找不到好的资源。我的目标是:
BinaryTree.from_string("('a') 'b' ('c')")
-->BinaryTree("a", "b", "c")
BinaryTree.from_string("")
-->None
BinaryTree.from_string("() ()")
-->BinaryTree(None, None, None)
BinaryTree.from_string("((1) 2 (3)) 4 (5)")
-->BinaryTree(BinaryTree(1, 2, 3), 4, 5)
以下是一些源代码:
class BinaryTree:
def __init__(self, left=None, name=None, right=None):
self.left = left
self.name = name
self.right = right
def __str__(self):
return f"({self.left}) {self.name} ({self.right})"
def __repr__(self):
return f"BinaryTree({repr(self.left)}, {repr(self.name)}, {repr(self.right)})"
def __len__(self):
if self.name is not None:
output = 1
else:
output = 0
if self.left is not None:
output += len(self.left)
if self.right is not None:
output += len(self.right)
return output
@staticmethod
def from_string(string):
# "(x) y (z)" --> BinaryTree("x", "y", "z")
# "((a) b (c)) y (z)" --> BinaryTree(BinaryTree("a", "b", "c"), "y", "z")
# "" --> None
# () () --> BinaryTree("", "", "")
pass
您可以使用正则表达式,但只能将其用于标记输入,即它应将所有括号作为单独的匹配项进行匹配,并匹配带引号或不带引号的文字。必须注意在引用的子字符串中支持反斜杠转义
要将带引号的字符串和数字转换为相应的Python数据类型值,可以使用
ast.literal_eval
。当然,如果输入格式是一个有效的Python表达式(使用逗号分隔符等),则可以将解析完全留给ast.literal_eval
。但由于情况并非如此,您必须对输入进行标记化并对标记进行迭代因此,请输入以下内容:
然后:
首先,我认为您需要放弃正则表达式的概念,专注于简单的括号匹配。这里有一个非常简单的表达式语法。我不想重复这样一个旅行频繁的练习,而是简单地指导您研究如何用括号解析二叉树表达式
基本表达式是
其中
left
和right
中的每一个请注意,您有一些歧义。例如,给定
a b
,结果树是(a, b, None)
、(None, a, b)
还是错误在任何情况下,如果您专注于简单的字符串处理,您应该能够在没有外部包的情况下完成这项工作:
你能从那里拿走吗
相关问题 更多 >
编程相关推荐