您可以使用RegEx开发自己的解析器。在你的情况下,这并不难。您可以解析括起来的花括号,然后拆分项目并递归计算每个项目。在
以下是一个例子(并不完美):import re
RE_BRACE = r"\{.*\}"
RE_ITEM = r"\d+[a-z]+"
RE_FLOAT = r"[-+]?\d*\.\d+"
RE_INT = r"\d+"
find_all_items = re.compile(
"|".join([RE_BRACE, RE_ITEM, RE_FLOAT, RE_INT]),
flags=re.DOTALL).findall
def parse(text):
mo = re.match(RE_BRACE, text, flags=re.DOTALL)
if mo:
content = mo.group()[1:-1]
items = [parse(part) for part in find_all_items(content)]
return items
mo = re.match(RE_ITEM, text, flags=re.DOTALL)
if mo:
return mo.group()
mo = re.match(RE_FLOAT, text, flags=re.DOTALL)
if mo:
return float(mo.group())
mo = re.match(RE_INT, text, flags=re.DOTALL)
if mo:
return int(mo.group())
raise Exception("Invalid text: {0}".format(text))
注意:这个解析器无法正确解析{1 {2} {3} 4}。为此,您需要一个类似pyparsing的递归解析器。在
演示:
^{pr2}$
你会得到:[1, 4, ['2a', 0.0, [3, 0.0, '4c', 0.0], 5, 0.0]]