问题描述:
问题来源与《Python基础教程》第二十个章节
假设你从一个不想写HTML代码的人那里得到了一个文件,希望将它作为一个网页来使用,你本身也不想自己手的那个的为文档添加所需要的全部标签,而是想要让程序自动完成。程序所要做的工作就是就是将各种文本元素分类,比如标题和被强调的文本,然后明确的标记他们。
完成的目标:
输入不应该包含人工代码或者标签。
程序能够处理不同的块(block),比如标题、段落、列表项、内嵌文本(比如被强调的文本和URL)
如果处理的不仅仅HTML,能够扩展到其他的标记语言就更好了。
初次实现
首先要做的是把文本切成段落,在测试文档中,段落与段落之间用空格格开了。所以找到一个段落的简单方法就是收集遇到的所有的行,直到遇到一个空行,然后返回已经收集的行。那些返回的行就是一个段落。之后,在开始收集,不需要收集空行,也不要返回空段落(在遇到多个空行时)。同时,要群豹文件的最后一行是空行,否则,程序就不知道什么时候结束。
文本生成器,代码如下(util.py)
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 = []
实现简单的标记:
打印一些开始标记;
打印每个用段落标签括起来的块;
点一些结束标记;
对于第一个段落,用(h1)括起来,区分标题与段落,代码(simple_makeup.py)实现如下:
import sys, re
from util import *
print('<html><head><title>...</title><body>')
title = True
for block in blocks(open(r'D:\Python27\test_input.txt')):
block = re.sub(r'\*(.+?)\*',r'<em>\1</em>',block)
if title:
print('<h1>')
print block
print('</h1>')
title = False
else:
print('<p>')
print block
print('</p>')
print('</body></html>')
实现结果简单的区分了标题和段落: