日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python练习1-文档格式化成html

發布時間:2025/6/17 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python练习1-文档格式化成html 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文檔格式化成HTML

? ? 把文檔格式化成了THML,并沒有處理所有thml規則,只是處理了一部分,功能不重要,重要的是復習熟悉下Python對文檔的處理細節。畢竟Python大多數給我的印象都是處理文檔。代碼里有很多邏輯可能不嚴謹,這里再次強調只是為了復習字符串以及文檔操作。

? ? 同時提醒一下,如果運行失敗,請刪除注釋,我是用vs2015編寫的,返現當時中文注釋導致編碼錯誤運行失敗。一共四個文檔:


?入口文檔是markup.py

參數?python?markup.py?<?xxx.txt?>?xxx.html

執行效果和代碼如下:



Util.py

def lines(file):for line in file:yield lineyield '\n'def blocks(file):block = []for line in lines(file):if line.strip(): #'\n','\r','\t',' 'block.append(line);elif block:yield ''.join(block).strip()block = []
Handlers.py

class Handler:"""處理從Parser調用的方法的對象。這個解析器會在每個塊的開始部分調用start()和end()方法,使用合適的塊名作為參數,sub()方法會用于正則表達式替換中。當使用了'emphasis'這樣的名字調用時,它會返回合適的替換函數。"""def callback(self ,prefix ,name ,*args):method = getattr(self ,prefix + name ,None)if callable(method) : return method(*agrs)def start(self ,name):self.callback('start_',name);def end(self ,name):self.callback('end_',name);def sub(self ,name):def substitution(match):result = self.callback('sub_' ,name ,match)if result is None: match.group(0)return resultreturn substitutionclass HTMLRenderer(Handler):"""用于生成HTML的具體處理程序THMLRenderer內容的方法都是可以通過超類處理程序的start()、end()和sub()方法來訪問。他們實現了用于HTRML文檔的基本標簽。"""def start_document(self):print('<html><head><title>...</title></head><body>')def end_document(self):print('</body></html>')def start_paragraph(self):print('<p>')def end_paragraph(self):print('</p>')def start_heading(self):print('<h2>')def end_heading(self):print('</h2>')def start_list(self):print('<ul>')def end_list(self):print('</ul>')def start_listitem(self):print('<li>')def end_listitem(self):print('</li>')def start_title(self):print('<title>')def end_title(self):print('</title>')def sub_emphasis(self ,match):return ('<em>%s</em>' % match.group(1))def sub_url(self ,match):return ('<a href = "%s">%s</a>' % (match.group(1),match.group(1)))def sub_mail(self ,match):return ('<a href="mailto:%s">%s</a>' % (match.group(1),match.group(1)))def feed(self ,data):print(data)

Rules.py

class Rule:"""所有規則的基類。"""def action(self ,block ,handler):handler.start(self.type)handler.feed(block)handler.end(self.type)return Trueclass HeadingRule(Rule):"""標題占一行,最多70個字符,并且不以冒號結尾。"""type = 'heading'def condition(self ,block):return not '\n' in block and len(block) <= 70 and not block[-1] == ':'class TitleRule(HeadingRule):"""題目是文檔的第一個塊,但前提它是大標題。"""type = 'title'first = Truedef condition(self, block):if not self.first:return Falseself.first = HeadingRule.condition(self ,block)class ListItemRule(Rule):"""列表項是以連字符開始的段落。作為格式化的一部分,要移除連字符。"""type = 'listitem'def condition(self ,block):return block[0] == '-'def action(self, block, handler):handler.start(self.type)handler.feed(block[1:].strip())handler.end(self.type)return Trueclass ListRule(ListItemRule):"""列表從不是列表項的塊和歲以后的列表項之間。在最后一個連續的列表項之后結束。"""type = 'list'inside = Falsedef condition(self ,block):return Truedef action(self, block, handler):if not self.inside and ListItemRule.condition(self ,block):handler.start(self.type)self.inside = Trueelif self.inside and not ListItemRule.condition(self ,block):handler.end(self.type)self.inside = Falsereturn Falseclass ParagraphRule(Rule):"""段落只是其他規則并沒有覆蓋到的塊"""type = 'paragraph'def condition(self ,block):return True

Markup.py

import sys,re from handlers import * from util import * from rules import *class Parser:#"""#語法分析器讀取文本文件、應用規則并且控制處理程序# """def __init__(self ,handler):self.handler = handlerself.rules = []self.filters = []def addRule(self ,rule):self.rules.append(rule)def addFilter(self ,pattern ,name):def filter(bolck ,handler):return re.sub(pattern ,handler.sub(name),bolck)self.filters.append(filter)def parse(self ,file):self.handler.start('document')for block in blocks(file):for filter in self.filters:block = filter(block ,self.handler)for rule in self.rules:if rule.condition(block):last = rule.action(block ,self.handler)if last : breakself.handler.end('document')class BasicTextParser(Parser):"""在構造函數中添加規則和過濾器的具體語法分析器"""def __init__(self, handler):Parser.__init__(self ,handler)self.addRule(ListRule)self.addRule(ListItemRule)self.addRule(TitleRule)self.addRule(HeadingRule)self.addRule(ParagraphRule)self.addFilter(r'\*(.+?)\*' ,'emphasis')self.addFilter(r'(http://[\.a-zA-Z/]+)' ,'url')self.addFilter(r'([\.a-zA-Z])+@[\.a-zA-Z]+[a-zA-Z]+)' ,'mail')handler = HTMLRenderer() parser = BasicTextParser(handler)parser.parse(sys.stdin)

總結

以上是生活随笔為你收集整理的Python练习1-文档格式化成html的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产深喉视频一区二区 | 亚洲看片网| 老子午夜影院 | 激情91| 精品久久久久久久久久久 | 欧美熟女一区二区 | 天堂av日韩 | 黄色三级在线播放 | 亚洲午夜视频在线观看 | 成人福利av| 一级片视频免费观看 | 男女视频国产 | 午夜视频在线网站 | 好吊色综合 | 日本免费一区二区三区四区 | sm乳奴虐乳调教bdsm | 国产成人精品一区二区无码呦 | av性天堂网 | 天堂av2018| 性史性dvd影片农村毛片 | 亚洲高清视频一区 | 嫩草视频入口 | 超清纯大学生白嫩啪啪 | 福利国产在线 | 久久五| 私密spa按摩按到高潮 | 亚洲综合一区在线观看 | 日韩亚洲欧美一区二区 | 亚洲国产伊人 | av嫩草| 四虎少妇做爰免费视频网站四 | 视频一区二区三区在线观看 | 横恋母在线观看 | 黄色三级在线视频 | 蜜桃av久久久亚洲精品 | 精品啪啪| 香蕉污视频在线观看 | 成人av动漫在线观看 | 白丝开裆喷水 | 久久久精品在线观看 | 手机看片91 | 免费观看污 | 欧美性动态图 | 国产精品66 | 乌克兰做爰xxxⅹ性视频 | 久草免费看 | 色综合天天色综合 | 黄网在线观看视频 | 免费久久一级欧美特大黄 | 99热这里只有精品在线观看 | 久久久高清视频 | 麻豆影视网站 | 91国自产精品中文字幕亚洲 | 免费一级片网址 | 免费看欧美一级片 | 国内国产精品天干天干 | 久久久久久欧美精品se一二三四 | 69久久久久| 人妻少妇一区 | 天天干夜夜草 | 无码aⅴ精品一区二区三区浪潮 | 国产视频精品在线 | 草草视频在线播放 | 日韩中文久久 | 好吊色av| 一本一道波多野结衣一区二区 | 污网站免费在线 | 国产中文字幕在线 | 日本高清不卡一区 | 国产白浆一区二区 | 国产一区黄色 | 欧美国产高清 | 国产精品影院在线观看 | 欧美精品一区二区不卡 | 天天综合欧美 | 亚洲国产精品无码久久 | 久久综合色综合 | 国产精品久久久久国产a级 国产一区二区在线播放 | 日韩精品免费一区二区在线观看 | 狠狠v欧美v日韩v亚洲ⅴ | 91精品国自产在线偷拍蜜桃 | 国内精品亚洲 | 日韩精品电影网 | 99热亚洲 | 欧美精品久久久久久久自慰 | 亚洲一区二区三区四区在线观看 | 欧美亚洲一区二区三区 | 自拍偷拍另类 | 国产成人av免费观看 | 亚洲av无码国产精品麻豆天美 | 18禁超污无遮挡无码免费游戏 | 少妇裸体视频 | 久草视频在线免费 | 毛片大全免费 | 日日爽夜夜操 | 伊人久色| 成年人国产视频 | 我和我的太阳泰剧在线观看泰剧 | 亚洲伦理一区二区三区 |