сглаживать сглаживать отступ - PullRequest
0 голосов
/ 14 декабря 2018

Следующий код анализирует левые пробелы и устанавливает все объекты в одну строку.

Сценарий проверяет, равна ли позиция тогда:
обновляет временный массив в этой позиции и записывает всеобъект с удалителем в стеке

Если позиция больше, чем:
обновить массив temp в этой позиции и направить весь объект с удалителем в стеке до этой позиции

Если позиция меньше, чем:
обновить временный массив в этой позиции, удалить весь вышестоящий объект и записать весь объект с удалителем в стек до этой позиции

Есть ли лучший, более короткий способ добиться того же самого?

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|||||||||||||||||||
........
...