pyparsing扁平缩进块

时间:2018-12-14 13:33:24

标签: pyparsing

以下代码分析左侧空间并将所有对象设置在一行上。

脚本检查位置是否相等,然后:
在该位置上更新temp数组,并将所有带有代词符的对象写入堆栈中

如果位置更大,则:
在该位置更新temp数组,并在堆栈上将所有带有deleminiter的对象移到该位置

如果位置小于此位置,则:
在该位置上更新temp数组,删除所有较高的对象,并在该位置上将所有带有deleminiter的对象写入堆栈中,直到该位置

有没有更好,更短的方法来达到相同的目的?

import pyparsing as pp

class Parser(object):
def __init__(self):
    self.__config_line = []
    self.__config_all = []
    self.__loc_last = 0
    self.__position_last = 0
    self.__dimension = 20

    start = pp.OneOrMore(pp.Word(pp.printables))
    self.__pattern = pp.Combine((start+pp.restOfLine), joinString='').setParseAction(self.test)

def test(self,s, loc, toks):

    position_current = loc - self.__loc_last
    self.__loc_last = loc + 1 + len(toks[0])
    position_delta = position_current - self.__position_last
    self.__position_last = position_current

    if position_current == 0:
        self.__config_line = [''] * self.__dimension
        self.__config_line[position_current] = toks[0]

    elif position_delta == 0:
        self.__config_line[position_current] = toks[0]

    elif position_delta < 0:
        self.__config_line[position_current:self.__dimension] = [''] * (self.__dimension - 1 - position_current)
        self.__config_line[position_current] = toks[0]

    elif position_delta > 0:
        self.__config_line[self.__position_last + 1:self.__dimension] = [''] * (self.__dimension - 1 - self.__position_last)
        self.__config_line[position_current] = toks[0]

    self.__position_last = position_current
    self.__config_all.append(list(self.__config_line))

def parse(self, line):
    try:
        parsed = self.__pattern.searchString(line)
        return self.__config_all
    except pp.ParseException as x:
        #print x
        #return False
        pass

如果我使用以下参数运行代码:

if __name__ == "__main__":
parser = Parser()

test="""first level config parameter 1-n
 second level config parameter 1-n
  thirt level config parameter 1-n
 second level config parameter 1-n
  thirt level  config parameter 1-n
first level config parameter 1-n"""
print ("## Test String level based ##")
print ("#############################")
print(test)
print ("## Test String formal translated ##")
print ("###################################")
a = "\n".join(map("|".join, parser.parse(test)))
print (a)
print (parser.parse(test))

我得到以下输出:

first level config parameter 1-n|||||||||||||||||||
first level config parameter 1-n|second level config parameter 1-n||||||||||||||||||
first level config parameter 1-n|second level config parameter 1-n|thirt level config parameter 1-n|||||||||||||||||
first level config parameter 1-n|second level config parameter 1-n|||||||||||||||||
first level config parameter 1-n|second level config parameter 1-n|thirt level  config parameter 1-n|||||||||||||||||
first level config parameter 1-n|||||||||||||||||||
........

0 个答案:

没有答案