Python解析树状数据

时间:2011-10-11 21:29:10

标签: python parsing

我有一个字体的字形信息,如下所示:

(CHARACTER C T
   (CHARWD R 0.6944475)
   (CHARHT R 0.686111)
   (COMMENT
      (KRN C y R -0.027779)
      (KRN C e R -0.083334)
      (KRN C o R -0.083334)
      (KRN C r R -0.083334)
      (KRN C a R -0.083334)
      (KRN C A R -0.083334)
      (KRN C u R -0.083334)
      )
   )

有没有直接的方法在python中解析这个?我之前使用过BeautifulSoup,但它需要嵌套的<tag> </tag>类信息。将它转换为XML并重新转换并不难 - 但似乎它将重新发明轮子。我如何将这些信息输入到我可以操作并再次吐出的数据对象中?

2 个答案:

答案 0 :(得分:6)

您可以使用pyparsing。您的示例看起来非常像s-expression,他们在examples section中有一个s表达式解析器:http://pyparsing.wikispaces.com/file/view/sexpParser.py

答案 1 :(得分:2)

这会将您的数据转换为python数据结构。不确定这是不是你想要的?

s = """(CHARACTER C T
       (CHARWD R 0.6944475)
       (CHARHT R 0.686111)
           (COMMENT
           (KRN C y R -0.027779)
           (KRN C e R -0.083334)
           (KRN C o R -0.083334)
           (KRN C r R -0.083334)
           (KRN C a R -0.083334)
           (KRN C A R -0.083334)
           (KRN C u R -0.083334)
           )
        )"""

s = re.sub("\)", "\),", s)
t = re.sub('([(,\s])(\w+)', '\\1"\\2",', s)
eval(t[:-1].replace('\\', ''))