以下代码分析左侧空间并将所有对象设置在一行上。
脚本检查位置是否相等,然后:
在该位置上更新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|||||||||||||||||||
........