我需要解析文本列表:
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
所述的“状态机”方法答案 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
的问题吗?