使用多个条件创建递归Python函数

使用多个条件创建递归Python函数,python,recursion,Python,Recursion,背景:我正在尝试编写一个函数,用于解析从PDF转换而来的纯文本文档中的消息数据。我已经对数据进行了解析和清理,以便于识别相关文本的每一行,并用适当的类别进行标记。类别为(作者、已发送、正文、附件) 问题是:我正在尝试编写一个函数,将数据分离成单独的消息。例如,在处理属于每个类别的一行(或多行)之后,它将输出一条单一消息,然后在再次遇到元组的开头时重复该过程。换句话说,一旦它读到作者然后发送然后正文然后附件,当它再次看到作者时,它应该知道启动一条新消息 我已经创建了一个变量next\u categ

背景:我正在尝试编写一个函数,用于解析从PDF转换而来的纯文本文档中的消息数据。我已经对数据进行了解析和清理,以便于识别相关文本的每一行,并用适当的类别进行标记。类别为
(作者、已发送、正文、附件)

问题是:我正在尝试编写一个函数,将数据分离成单独的消息。例如,在处理属于每个类别的一行(或多行)之后,它将输出一条单一消息,然后在再次遇到元组的开头时重复该过程。换句话说,一旦它读到
作者
然后
发送
然后
正文
然后
附件
,当它再次看到
作者
时,它应该知道启动一条新消息

我已经创建了一个变量
next\u category
,它决定了,顾名思义,下一行的类别。只要即将出现的类别的索引不是
0
,该功能就应该运行。当下一个类别为
0
时,应在新行上重复该操作,直到再次达到
0
,依此类推

最后,还有一个条件,
next_category
可以等于
None
,在这种情况下,函数应该完全退出

守则:

    def message_parse(thread_dict):
        categories = ('Author', 'Sent', 'Body', 'Attachments')
        category = None


        for line in range(len(thread_dict['data'])):
            # determine first word in line
            first_word = thread_dict['data'][line].split(' ')[0]

            try:
                # determine first word in upcoming line
                next_first = first_word = thread_dict['data'][line+1].split(' ')[0]
            except:
                next_first = None

            if next_first in categories:
                next_category = next_first

            if first_word in categories:
                category = first_word


                if category != None:
                    line_data = thread_dict['data'][line]
                    if not 'DRAFT' in line_data:
                        if line_data != 'EXC':
                            line_data = line_data.strip(category).strip(' ')

                        while next_first != None:    
                            if categories.index(next_category) != 0:
                                # do something?
我的直觉告诉我,我需要创建一个递归函数来实现这一点,但我在想办法时遇到了困难。谁能给我指出正确的方向吗


非常感谢。

为什么您觉得需要再次出现?另外,你的输入数据是什么样的?迭代并解决这个问题,这实际上不需要递归。我同意@Paritossingh,这不是递归问题,而是解析问题。而且,这种类型的数据可以很好地作为CSV使用,这将使解析变得更容易。@Mad物理学家对我来说,递归的感觉是,我需要在类别列表中循环,执行操作,然后在所有类别都出现一次后停止,并在一组新的行上再次执行相同的操作,并不断重复,直到满足最终条件。原始输入是一个转换成文本的PDF文档。听起来像是一个循环,而不是递归。虽然这两者可以互换使用,但我认为您不希望创建可能无限多的堆栈帧。