解析多级文本lis

2024-05-17 04:05:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要解析文本列表:

1 List name

1 item
2 item
3 item

2 List name

1 item
2 item
3 item

3 List name

1 item
2 item
3 item

我试图使用正则表达式拆分第一级列表:

^{pr2}$

但它不起作用。而不是这样:

{
1 List name

1 item
2 item
3 item}
{
2 List name

1 item
2 item
3 item}
{
3 List name

1 item
2 item
3 item}

我有这个:

{
1 List name}
{
1 item
2 item
3 item}
{
2 List name}
{
1 item
2 item
3 item}

3 List name

1 item
2 item
3 item

你有什么建议来解决这个问题?在

感谢您的回答。我学到了Python的许多新特性。在

我想,我将使用描述的“状态机”方法here


Tags: 方法name文本列表here特性item建议
3条回答

这里有一种使用字典的方法

f=open("myfile")
d={}
e=0
for line in f:
    line=line.rstrip()
    if "List" in line:
      e=e+1
      d.setdefault(e,[])
    d[e].append(line)
f.close()
for i ,j in d.iteritems():
    print i,j

你能控制列表格式吗?只需稍作编辑,就可以将其转换为配置文件格式,并使用ConfigParser模块。在

否则,用一点递归怎么样?在

from collections import defaultdict

def fill_data(data, key, sequence, pred):
    """Recursively fill the data dictionary"""
    for item in sequence:
        # if the pred is true, add it to the list
        if pred(item):
            data[key].append(item)
        # otherwise recurse, with item as key
        else:
            return fill_data(data, item, sequence, pred)
    return data

# a key->list dictionary
data = defaultdict(list)
# Get the text as a sequence of non-empty lines
lines = (l for l in s.splitlines() if l.strip())

def is_data_line(line):
    """Is this line a data line (i.e. two items)?"""
    return len(line.split()) == 2

result = fill_data(data, None, lines, is_data_line )

print dict(result)

输出(经过修饰)

^{pr2}$
class ListParser:

 def __init__(self, s):
  self.str = s.split("\n")
  print self.str
  self.answer = []

 def parse(self):
  self.nextLine()
  self.topList()
  return

 def topList(self):
  while(len(self.str) > 0):
   self.topListItem()

 def topListItem(self):
  l = self.nextLine()
  print "TOP: " + l
  l = self.nextLine()
  if l != '':
   raise Exception("expected blank line but found '%s'" % l)
  sub = self.sublist()

 def nextLine(self):
  return self.str.pop(0)

 def sublist(self):
  while True:
   l = self.nextLine()
   if l == '':
    return # end of sublist marked by blank line
   else:
    print "SUB: " + l

parser = ListParser(s)
parser.parse() 
print "done"

印刷品

^{pr2}$

相关问题 更多 >