返回信息流现在遇到一个问题。急。
以下是一个大列表,纯文本格式,字符集好办,我会转换。文件格式大概如下:
/****************** begin 这行不在文件中 */
= 1 基本概念
1.1 数据类型
1.2 运算符
1.3 表达式
1.4 语句
= 2 流程控制
2.1 顺序结构
2.2 选择结构
2.3 循环结构
= 3 函数
3.1 函数的概念
3.2 函数的定义和调用
3.3 函数的嵌套调用
3.4 函数的递归调用
= 4 指针
4.1 指针的概念
4.2 指针的定义
4.3 指向数组的指针
4.4 指针数组和指向指针的指针
= 5 结构体 共用体
5.1 数据类型与集合
5.2 交集、并集、笛卡尔乘积
5.3 结构体的定义
5.4 结构体成员引用
5.5 指向结构体的指针
5.6 共用体
5.7 结构体、共用体嵌套
= 6 文件IO
6.1 打开文件、关闭文件
6.2 文件定位
/*************************** end 这行也不在文件中 */
格式:
这是一本书的目录。书的大标题叫《C语言基础》
凡是以=开头的行是“章”标题,其它的是“节”标题。空行无效。
一章后面跟着的若干节属于该章。
章标题,=后面跟1个或多个空格,然后是章编号,然后一个或多个空格,然后到行尾(忽略行尾空格)都是章标题。
节标题,第一个字段是节编号,之后的是节标题,前后空格不计。
我需要做一个小程序,输入是这个表,对于每章输出一个文件,是这一章的目录,包括该章的所有节的标题。最后输出一个文件,是全书目录,只包含全书大标题《C语言基础》和每章标题,不要节标题。
文件特别大,不要妄想slurp,要On the fly处理,每读完一节生成一个文件。最后生成总目录文件。
大概是这样:
1_基本概念.xml
<chapter>
<num>1</num>
<title>基本概念</title>
<sections>
<section><num>1.1</num><title>数据类型</title></section>
<section><num>1.2</num><title>运算符</title></section>
<section><num>1.3</num><title>表达式</title></section>
<section><num>1.4</num><title>语句</title></section>
</sections>
</chapter>
2_流程控制.xml
<chapter>
<num>2</num>
<title>流程控制</title>
<sections>
<section><num>2.1</num><title>顺序结构</title></section>
<section><num>2.2</num><title>选择结构</title></section>
<section><num>2.3</num><title>循环结构</title></section>
</sections>
</chapter>
其它章类似。
大目录如下:
<book>
<title>C语言基础</title>
<chapters>
<chapter><num>1</num><title>基本概念</title></chapter>
<chapter><num>2</num><title>流程控制</title></chapter>
<chapter><num>3</num><title>函数</title></chapter>
<chapter><num>4</num><title>指针</title></chapter>
<chapter><num>5</num><title>结构体 共用体</title></chapter>
<chapter><num>6</num><title>文件IO</title></chapter>
</chapters>
</book>
要求:代码美观整洁,主要是流程控制部分。
什么语言都行。
大牛来帮帮忙
在线等。
这是一条镜像帖。来源:北邮人论坛 / soft-design / #25478同步于 2008/5/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
跪求一个简单的文本文件的分析脚本
wks
2008/5/17镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
正则匹配?你都把规则总结出来了……
【 在 wks (cloverprince) 的大作中提到: 】
: 现在遇到一个问题。急。
: 以下是一个大列表,纯文本格式,字符集好办,我会转换。文件格式大概如下:
: /****************** begin 这行不在文件中 */
: ...................
这是一个很ugly的伪代码:
##############################################
lst = open('list.txt')
book_title = "C语言"
chap_list = []
ln = lst.readline()
while True:
if ln=="":
break
ln = ln.strip()
if ln=="":
continue
if ln[0]=='=':
lp = ln.split()[1:]
(chap_no,chap_title) = (lp[0]," ".join(lp[1:]))
chap_list.append((chap_no, chap_title))
sect_list=[]
while True:
ln = lst.readline()
if ln=="":
break
ln = ln.strip()
if ln=="":
continue
lp = ln.split()
if lp[0]=='=':
break
(sect_no,sect_title) = (lp[0]," ".join(lp[1:]))
sect_list.append((sect_no,sect_title))
wf = open(chap_no+".xml","w")
content = makechapter()
wf.write(content)
wf.close()
wf = open('index.xml','w')
content = makebook()
wf.write(content)
wf.close()
#########################################
看,readline()散步得到处都是,还有各种乱七八糟的条件判断,还有各种break,continue什么的。能不能把这个代码写得*beautiful*一点呢?
正则表达式。。
【 在 wks (cloverprince) 的大作中提到: 】
: 现在遇到一个问题。急。
: 以下是一个大列表,纯文本格式,字符集好办,我会转换。文件格式大概如下:
: /****************** begin 这行不在文件中 */
: ...................
嗯,正则式果然很好很强大。
# coding: gb2312
import re
rechap = re.compile(r'^\s*=\s+(?P<chap_no>\d+)\s+(?P<chap_title>\S.*)\s*$')
resect = re.compile(r'^\s*(?P<sect_no>\d+\.\d+)\s+(?P<sect_title>\S.*)\s*$')
srcfile = open("list.txt");
booktitle="C programming"
chaplist=[]
sectlist=[]
curchap=None
for ln in srcfile:
m=rechap.match(ln)
if m != None:
writechap()
curchap=m.group('chap_no','chap_title')
chaplist.append(curchap)
sectlist=[]
else:
m=resect.match(ln)
if m != None:
sectlist.append(m.group('sect_no','sect_title'))
else:
pass
writebook()
本来想用一个正则表达式匹配整个文件的,后来还是没有成功。
【 在 wks 的大作中提到: 】
: 嗯,正则式果然很好很强大。
: # coding: gb2312
: import re
: ...................
匹配整个文件是可以的, 加一个无用行的正则式
regexp = re.compile(r'''^\s*=\s+(?P<chap_no>\d+)\s+(?P<chap_title>\S.*)\s*$)
|^\s*(?P<sect_no>\d+\.\d+)\s+(?P<sect_title>\S.*)\s*$
|(.*)\n""", re.VERBOSE)
然后用regexp.scanner 去匹配文件
scanner = regexp.scanner()
while 1:
m = scanner.match(file)
然后根据m.groups()处理