解析多级文本列表

时间:2009-12-11 01:36:39

标签: python regex parsing

我需要解析文本列表:

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

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

import re
def re_show(pat, s):
 print re.compile(pat, re.S).sub("{\g<0>}", s),'\n'

s = '''
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
'''

re_show('\n\d+.*?(?=\n\n\d+.*?\n\n)', s)

但它不起作用。而不是:

{
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

所述的“状态机”方法

4 个答案:

答案 0 :(得分:2)

您是否可以控制列表格式?只需稍加编辑,您就可以将其转换为配置文件格式,并使用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)

输出(美化)

{'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']}

答案 1 :(得分:1)

这是使用字典

的一种方式
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

答案 2 :(得分:1)

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"

打印

TOP: 1 List name
SUB: 1 item
SUB: 2 item
SUB: 3 item
TOP: 2 List name
SUB: 1 item
SUB: 2 item
SUB: 3 item
TOP: 3 List name
SUB: 1 item
SUB: 2 item
SUB: 3 item
done

答案 3 :(得分:0)

我怀疑我忽略了这一点,但这不仅仅是寻找List的问题吗?