Следующий код анализирует левые пробелы и устанавливает все объекты в одну строку.
Сценарий проверяет, равна ли позиция тогда:
обновляет временный массив в этой позиции и записывает всеобъект с удалителем в стеке
Если позиция больше, чем:
обновить массив 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|||||||||||||||||||
........