<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        python的即時標記項目練習筆記

        來源:懂視網 責編:小采 時間:2020-11-27 14:38:03
        文檔

        python的即時標記項目練習筆記

        python的即時標記項目練習筆記:這是《python基礎教程》后面的實踐,照著寫寫,一方面是來熟悉python的代碼方式,另一方面是練習使用python中的基本的以及非基本的語法,做到熟能生巧。 這個項目一開始比較簡單,不過重構之后就有些復雜了,但是更靈活了。 按照書上所說,重構之后的程序,分
        推薦度:
        導讀python的即時標記項目練習筆記:這是《python基礎教程》后面的實踐,照著寫寫,一方面是來熟悉python的代碼方式,另一方面是練習使用python中的基本的以及非基本的語法,做到熟能生巧。 這個項目一開始比較簡單,不過重構之后就有些復雜了,但是更靈活了。 按照書上所說,重構之后的程序,分
        這是《python基礎教程》后面的實踐,照著寫寫,一方面是來熟悉python的代碼方式,另一方面是練習使用python中的基本的以及非基本的語法,做到熟能生巧。

        這個項目一開始比較簡單,不過重構之后就有些復雜了,但是更靈活了。

        按照書上所說,重構之后的程序,分為四個模塊:處理程序模塊,過濾器模塊,規則(其實應該是處理規則),語法分析器。

        先來說處理程序模塊,這個模塊的作用有兩個,一個是提供那些固定的html標記的輸出(每一個標記都有start和end),另一個是對這個標記輸出的開始和結束提供了一個友好的訪問接口。來看下程序handlers.py:

        代碼如下:


        class Handler:
        '''
        '''
        def callback(self, prefix, name, *args):
        method = getattr(self,prefix+name,None)
        if callable(method): return method(*args)
        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 result
        return substitution

        class HTMLRenderer(Handler):
        '''

        '''
        def start_document(self):
        print '...'
        def end_document(self):
        print ''
        def start_paragraph(self):
        print '

        '
        def end_paragraph(self):
        print '

        '
        def start_heading(self):
        print '

        '
        def end_heading(self):
        print '

        '
        def start_list(self):
        print ''
        def end_list(self):
        print ''
        def start_listitem(self):
        print '
      1. '
        def end_listitem(self):
        print '
      2. '
        def start_title(self):
        print '

        '
        def end_title(self):
        print '

        '
        def sub_emphasis(self, match):
        return '%s' % match.group(1)
        def sub_url(self, match):
        return '%s' % (match.group(1),match.group(1))
        def sub_mail(self, match):
        return '%s' % (match.group(1),match.group(1))
        def feed(self, data):
        print data

        這個程序堪稱是整個“項目”的基石所在:提供了標簽的輸出,以及字符串的替換。理解起來也比較簡單。

        再來看第二個模塊“過濾器”,這個模塊更為簡單,其實就是一個正則表達式的字符串。相關代碼如下:

        代碼如下:


        self.addFilter(r'*(.+?)*', 'emphasis')
        self.addFilter(r'(http://[.a-z0-9A-Z/]+)', 'url')
        self.addFilter(r'([.a-zA-Z]+@[.a-zA-Z]+[a-zA-Z]+)','mail')

        這就是三個過濾器了,分別是:強調牌過濾器(用×號標出的),url牌過濾器,email牌過濾器。熟悉正則表達式的同學理解起來是沒有壓力的。

        再來看第三個模塊“規則”,這個模塊,拋開那祖父類不說,其他類應該有的兩個方法是condition和action,前者是用來判斷讀進來的字符串是不是符合自家規則,后者是用來執行操作的,所謂的執行操作就是指調用“處理程序模塊”,輸出前標簽、內容、后標簽。 來看下這個模塊的代碼,其實這個里面幾個類的關系,畫到類圖里面看會比較清晰。 rules.py:

        代碼如下:


        class Rule:
        def action(self, block, handler):
        handler.start(self.type)
        handler.feed(block)
        handler.end(self.type)
        return True

        class HeadingRule(Rule):
        type = 'heading'
        def condition(self, block):
        return not ' ' in block and len(block) <= 70 and not block[-1] == ':'

        class TitleRule(HeadingRule):
        type = 'title'
        first = True

        def condition(self, block):
        if not self.first: return False
        self.first = False
        return 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 True

        class ListRule(ListItemRule):
        type = 'list'
        inside = False
        def condition(self, block):
        return True
        def action(self,block, handler):
        if not self.inside and ListItemRule.condition(self,block):
        handler.start(self.type)
        self.inside = True
        elif self.inside and not ListItemRule.condition(self,block):
        handler.end(self.type)
        self.inside = False
        return False

        class ParagraphRule(Rule):
        type = 'paragraph'
        def condition(self, block):
        return True

        補充utils.py:

        代碼如下:


        def line(file):
        for line in file:yield line
        yield ' '

        def blocks(file):
        block = []
        for line in lines(file):
        if line.strip():
        block.append(line)
        elif block:
        yield ''.join(block).strip()
        block = []

        最后隆重的來看下“語法分析器模塊”,這個模塊的作用其實就是協調讀入的文本和其他模塊的關系。在往重點說就是,提供了兩個存放“規則”和“過濾器”的列表,這么做的好處就是使得整個程序的靈活性得到了極大的提高,使得規則和過濾器變成的熱插拔的方式,當然這個也歸功于前面在寫規則和過濾器時每一種類型的規則(過濾器)都單獨的寫成了一個類,而不是用if..else來區分。 看代碼:

        代碼如下:


        import sys, re
        from handlers import *
        from util import *
        from rules import *

        class Parser:
        def __init__(self,handler):
        self.handler = handler
        self.rules = []
        self.filters = []

        def addRule(self, rule):
        self.rules.append(rule)

        def addFilter(self,pattern,name):
        def filter(block, handler):
        return re.sub(pattern, handler.sub(name),block)
        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:break
        self.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-z0-9A-Z/]+)', 'url')
        self.addFilter(r'([.a-zA-Z]+@[.a-zA-Z]+[a-zA-Z]+)','mail')

        handler = HTMLRenderer()
        parser = BasicTextParser(handler)

        parser.parse(sys.stdin)

        這個模塊里面的處理思路是,遍歷客戶端(也就是程序執行的入口)給插進去的所有的規則和過濾器,來處理讀進來的文本。

        有一個細節的地方也要說一下,其實是和前面寫的呼應一下,就是在遍歷規則的時候通過調用condition這個東西來判斷是否符合當前規則。

        我覺得這個程序很像是命令行模式,有空可以復習一下該模式,以保持記憶網節點的牢固性。

        最后說一下我以為的這個程序的用途:

        1、用來做代碼高亮分析,如果改寫成js版的話,可以做一個在線代碼編輯器。
        2、可以用來學習,供我寫博文用。

        還有其他的思路,可以留下您的真知灼見。
        補充一個類圖,很簡陋,但是應該能說明之間的關系。另外我還是建議如果看代碼捋不清關系最好自己畫圖,自己畫圖才能熟悉整個結構。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        python的即時標記項目練習筆記

        python的即時標記項目練習筆記:這是《python基礎教程》后面的實踐,照著寫寫,一方面是來熟悉python的代碼方式,另一方面是練習使用python中的基本的以及非基本的語法,做到熟能生巧。 這個項目一開始比較簡單,不過重構之后就有些復雜了,但是更靈活了。 按照書上所說,重構之后的程序,分
        推薦度:
        標簽: 筆記 項目 練習
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产亚洲3p无码一区二区| 亚洲图片在线观看| 亚洲性无码AV中文字幕| 18禁黄网站禁片免费观看不卡| 亚洲国产精品国自产电影| 免费毛片a线观看| 亚洲韩国—中文字幕| 69影院毛片免费观看视频在线| 亚洲AV第一页国产精品| 最近最新高清免费中文字幕| 一区二区三区亚洲| 中文免费观看视频网站| 天天爽亚洲中文字幕| 在线a人片天堂免费观看高清| 亚洲成在人线aⅴ免费毛片| 国产精品久久香蕉免费播放| 欧亚一级毛片免费看| 综合亚洲伊人午夜网 | 久久国产成人亚洲精品影院| 国产精品免费久久久久影院| 伊人婷婷综合缴情亚洲五月| 国产精品区免费视频| 亚洲婷婷在线视频| 在线观看免费精品国产| 特黄特色大片免费| 国产成人亚洲综合无码精品| xxxxwww免费| 免费精品国自产拍在线播放| 亚洲精品V欧洲精品V日韩精品| 18禁黄网站禁片免费观看不卡| 亚洲AV男人的天堂在线观看| 一区国严二区亚洲三区| 精品四虎免费观看国产高清午夜| 亚洲第一福利视频| 麻豆国产VA免费精品高清在线| 欧洲乱码伦视频免费国产| 老司机亚洲精品影院无码| 精品久久久久久久免费加勒比| 四虎国产精品免费永久在线| 亚洲综合激情五月丁香六月| 久久精品国产亚洲5555|