如何从Python中的字符串解析树?

2024-06-28 10:58:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已将我所有的大学笔记格式化如下:

CourseName: {
    Part 1: {
        I.I - Intro: {
            Topic1: {
                descr1;
                descr2: {
                    2.a;
                    2.b;
                    2.c.
                };
                descr3.
            };
            Topic2: {
                descr: {
                    example.
                }.
            }.
        };
        I.II - NextChapter: {
            Topic3: {
                whatever.
            }.
        }.
    };
    Part 2: {
        II.I - FinalChapter: {
            content.
        }.
    }.
}

我想把它们组织成一个树型数据结构,在过去的几个小时里,我尝试过递归和迭代的方式,在网上做了很多研究,但我的尝试都没有奏效。在

我已经实现了一个节点类(带有self.__value和一个列表self.__children以及所有你希望从中得到的有用方法)以及一个树类(其中self.__nodes作为字典和其他实用方法),因此可以随意使用add_node或{}等任何形式的方法答案。在

我正在努力理解如何构造函数def parseTree(s, l)——理想情况下,它以字符串s(我的注释)和列表l作为输入,建立分隔符,即[":{", ";", "}."]或{}或类似的函数,并返回一个树对象,每个节点的值为:{前面的文本和文本中由;分隔的子节点列表(如果有)。在

有什么建议吗?在


Tags: 方法文本self列表节点大学ii笔记
2条回答

这实际上在句法上几乎是有效的。简单的替换将使其有效:

data = data.replace(';', ',').replace('.', '')
parsed = yaml.load(data)

假设您的数据存储在一个文件中,您可以构建一个简单的类来将结构解析为字典。通过为找到的每个键创建一个新的Notes对象,可以递归地遍历数据:

file_data = filter(None, [i.strip('\n') for i in open('filename.txt')])
import re
class Notes:
   def __init__(self, token_data):
     self.token_data = token_data
     self.current_dict = {}
     self.current_vals = []
     self.parse()
   def parse(self):
     while True:
       start = next(self.token_data, None)
       if not start or "}" in start:
         break
       if start.endswith('{'):
          note = Notes(self.token_data)
          final_result = filter(lambda x:x, note.current_vals + [note.current_dict]) if note.current_vals else note.current_dict
          self.current_dict[re.findall('[\w\s\-\.]+', re.sub('^\s+', '', start))[0]] = final_result[0] if isinstance(final_result, list) and len(final_result) == 1 else final_result
          self.token_data = note.token_data
       else:
          self.current_vals.append(re.sub('^\s+', '', start))


course_notes = Notes(iter(file_data)).current_dict

输出:

^{pr2}$

相关问题 更多 >