这个项目来自于《python基础教程》练习一
项目概述这是一个针对纯文本自动添加标签生成html或者其他可以文本格式项目思路
首先,要根据整个文本找出文本块;这个文本块可能是标题或者列表。 然后,可以设置规则将找出的块添加上一些标签项目的初次实现 找出文本块
1.收集空行前的所有行并将它们返回;由于最后一行没有空行,一种思路是添加上空行
def lines(file):
#在文件的末尾增加一个空行,确保下面可以找到每个文本块
for line in file:
yield line
yield "n"
def blocks(file):
block = [] #存放块
for line in lines(file):
if line.strip(): #过滤空白
block.append(line)
elif block: #找出文本块
yield ''.join(block).strip()
block = []
为文本添加标签
可以为文本添加一些(规则)标签,如标题等项目的再次实现
首先,为了提高程序的可扩展性,需要模块化,面向对象设计。
根据前面的初次实现,可以有:
1.可以保持找出文本块的模块继续使用
2.处理程序
不管时html还是其他标记文本,他们都有一套独立的处理标签...
,为此,可以将这部分独立出一个处理程序,这个模块可以实现不同的文本格式的处理;
处理程序的超类:
为了提高程序的灵活性;在超类实现一个start,end,sub方法;我们可以根据关键字直接调用对应的方法;
3.规则模块
前面的处理程序灵活性和可扩展性都非常高了;完成的实际上是添加不同的标记;但是我们任然不知道什么内容应该添加什么样的标记;为此,独立一个规则模块;为避免像前面一样使用各种if语句判断;
规则需要的功能如下:
知道自己适用于那种文本块(条件)
对文本块进行转换(操作)
因此,每个柜子对象都必须包含两个方法:condition和action
condition方法:
方法condition用于指出当前的规则是否适用于处理指定的文本块;返回布尔值;
action方法:
action方法需要能够访问处理程序完成处理;通常情况下,一个文本块只对应一种处理,比如,发现使用了标题规则,就不会使用段落规则;但是有可能应用一个规则后再次应用其他规则,因此,在action添加一项功能,返回布尔值,支出是否结束对文本块的处理。
规则的超类:
多个规则都可能实现相同的操作,调用处理程序的方法:start,end,feed
规则:
根据实际情况创建规则:
标题:只包含一行的文本块,长度最多为70个字符,以冒号结束的文本块不属于标题
列表项:
题目:
4.过滤器
在正文中有一些,特殊的文本,如:网址、邮箱,需要用过滤器;只需调用re.sub()即可,sub可以接收一个可调用的对象,传递了match对象并且必须返回要使用的替换字符串
re.sub()
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the Match object and must return
a replacement string to be used
5.解析器
解析器要完成声明工作呢?
完成准备工作:hander的初始化,规则列表、过滤列表的初始化
添加规则的方法
添加过滤器的方法
解析文本的方法
整合起来
只需要创建一个parser对象,并添加相应的规则和过滤器即可总结
项目的再次实现通过模块化将程序变得扩展性很好;极大的丰富了使用范围;同时项目也变得更为复杂。 重构之后的程序分为四个模块:处理程序、规则、过滤器、解析器;为处理程序和规则程序添加了超类,使得对象的访问更为容易; 在解析器模块:通过设置规则和过滤列表使得程序的灵活性力高 在规则模块:每个规则都使用一个类来定义,避免了过多的if...else,程序的结果更加清晰



