<p>您可以使用正则表达式,但只能将其用于标记输入,即它应将所有括号作为单独的匹配项进行匹配,并匹配带引号或不带引号的文字。必须注意在引用的子字符串中支持反斜杠转义</p>
<p>要将带引号的字符串和数字转换为相应的Python数据类型值,可以使用<code>ast.literal_eval</code>。当然,如果输入格式是一个有效的Python表达式(使用逗号分隔符等),则可以将解析完全留给<code>ast.literal_eval</code>。但由于情况并非如此,您必须对输入进行标记化并对标记进行迭代</p>
<p>因此,请输入以下内容:</p>
<pre><code>import re
import ast
</code></pre>
<p>然后:</p>
<pre><code> @staticmethod
def from_string(string):
tokens = re.finditer(r"[()]|'(?:\\.|[^'])*'|[^\s()]+|$", string)
def format(token):
return f"'{token}'" if token else "end of input"
def take(end, expect=None, forbid=None):
token = next(tokens).group(0)
if expect is not None and token != expect:
raise ValueError("Expected {}, got {}".format(format(expect), format(token)))
if end != "" and token == "" or token == forbid:
raise ValueError("Unexpected {}".format(format(token)))
if token not in ("(", ")", ""):
token = ast.literal_eval(token)
return token
def recur(end=")"):
token = take(end)
if token == end: # it is an empty leaf
return None
if token != "(": # it is a leaf
take(end, end)
return token
# It is a (left)-name-(right) sequence:
left = recur()
name = None
token = take(end, None, end)
if token != "(":
name = token
take(end, "(")
right = recur()
take(end, end)
return BinaryTree(left, name, right)
return recur("")
</code></pre>