最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python的即時(shí)標(biāo)記項(xiàng)目練習(xí)筆記

 更新時(shí)間:2014年09月18日 12:02:28   投稿:junjie  
這篇文章主要介紹了python的即時(shí)標(biāo)記項(xiàng)目練習(xí)筆記,本文是閱讀《python基礎(chǔ)教程》一書的動(dòng)手實(shí)踐項(xiàng)目,需要的朋友可以參考下

這是《python基礎(chǔ)教程》后面的實(shí)踐,照著寫寫,一方面是來(lái)熟悉python的代碼方式,另一方面是練習(xí)使用python中的基本的以及非基本的語(yǔ)法,做到熟能生巧。

這個(gè)項(xiàng)目一開始比較簡(jiǎn)單,不過(guò)重構(gòu)之后就有些復(fù)雜了,但是更靈活了。

按照書上所說(shuō),重構(gòu)之后的程序,分為四個(gè)模塊:處理程序模塊,過(guò)濾器模塊,規(guī)則(其實(shí)應(yīng)該是處理規(guī)則),語(yǔ)法分析器。

先來(lái)說(shuō)處理程序模塊,這個(gè)模塊的作用有兩個(gè),一個(gè)是提供那些固定的html標(biāo)記的輸出(每一個(gè)標(biāo)記都有start和end),另一個(gè)是對(duì)這個(gè)標(biāo)記輸出的開始和結(jié)束提供了一個(gè)友好的訪問(wèn)接口。來(lái)看下程序handlers.py:

復(fù)制代碼 代碼如下:

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 '<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 '<h1>'
    def end_title(self):
        print '</h1>'
    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

這個(gè)程序堪稱是整個(gè)“項(xiàng)目”的基石所在:提供了標(biāo)簽的輸出,以及字符串的替換。理解起來(lái)也比較簡(jiǎn)單。

再來(lái)看第二個(gè)模塊“過(guò)濾器”,這個(gè)模塊更為簡(jiǎn)單,其實(shí)就是一個(gè)正則表達(dá)式的字符串。相關(guān)代碼如下:

復(fù)制代碼 代碼如下:

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')

這就是三個(gè)過(guò)濾器了,分別是:強(qiáng)調(diào)牌過(guò)濾器(用×號(hào)標(biāo)出的),url牌過(guò)濾器,email牌過(guò)濾器。熟悉正則表達(dá)式的同學(xué)理解起來(lái)是沒(méi)有壓力的。

再來(lái)看第三個(gè)模塊“規(guī)則”,這個(gè)模塊,拋開那祖父類不說(shuō),其他類應(yīng)該有的兩個(gè)方法是condition和action,前者是用來(lái)判斷讀進(jìn)來(lái)的字符串是不是符合自家規(guī)則,后者是用來(lái)執(zhí)行操作的,所謂的執(zhí)行操作就是指調(diào)用“處理程序模塊”,輸出前標(biāo)簽、內(nèi)容、后標(biāo)簽。 來(lái)看下這個(gè)模塊的代碼,其實(shí)這個(gè)里面幾個(gè)類的關(guān)系,畫到類圖里面看會(huì)比較清晰。 rules.py:

復(fù)制代碼 代碼如下:

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 '\n' 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

補(bǔ)充utils.py:

復(fù)制代碼 代碼如下:

def line(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 = []

最后隆重的來(lái)看下“語(yǔ)法分析器模塊”,這個(gè)模塊的作用其實(shí)就是協(xié)調(diào)讀入的文本和其他模塊的關(guān)系。在往重點(diǎn)說(shuō)就是,提供了兩個(gè)存放“規(guī)則”和“過(guò)濾器”的列表,這么做的好處就是使得整個(gè)程序的靈活性得到了極大的提高,使得規(guī)則和過(guò)濾器變成的熱插拔的方式,當(dāng)然這個(gè)也歸功于前面在寫規(guī)則和過(guò)濾器時(shí)每一種類型的規(guī)則(過(guò)濾器)都單獨(dú)的寫成了一個(gè)類,而不是用if..else來(lái)區(qū)分。 看代碼:

復(fù)制代碼 代碼如下:

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)

這個(gè)模塊里面的處理思路是,遍歷客戶端(也就是程序執(zhí)行的入口)給插進(jìn)去的所有的規(guī)則和過(guò)濾器,來(lái)處理讀進(jìn)來(lái)的文本。

有一個(gè)細(xì)節(jié)的地方也要說(shuō)一下,其實(shí)是和前面寫的呼應(yīng)一下,就是在遍歷規(guī)則的時(shí)候通過(guò)調(diào)用condition這個(gè)東西來(lái)判斷是否符合當(dāng)前規(guī)則。

我覺得這個(gè)程序很像是命令行模式,有空可以復(fù)習(xí)一下該模式,以保持記憶網(wǎng)節(jié)點(diǎn)的牢固性。

最后說(shuō)一下我以為的這個(gè)程序的用途:

1、用來(lái)做代碼高亮分析,如果改寫成js版的話,可以做一個(gè)在線代碼編輯器。
2、可以用來(lái)學(xué)習(xí),供我寫博文用。

還有其他的思路,可以留下您的真知灼見。
補(bǔ)充一個(gè)類圖,很簡(jiǎn)陋,但是應(yīng)該能說(shuō)明之間的關(guān)系。另外我還是建議如果看代碼捋不清關(guān)系最好自己畫圖,自己畫圖才能熟悉整個(gè)結(jié)構(gòu)。

相關(guān)文章

  • python scipy卷積運(yùn)算的實(shí)現(xiàn)方法

    python scipy卷積運(yùn)算的實(shí)現(xiàn)方法

    這篇文章主要介紹了python scipy卷積運(yùn)算的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • pandas基礎(chǔ)?Series與Dataframe與numpy對(duì)二進(jìn)制文件輸入輸出

    pandas基礎(chǔ)?Series與Dataframe與numpy對(duì)二進(jìn)制文件輸入輸出

    這篇文章主要介紹了pandas基礎(chǔ)Series與Dataframe與numpy對(duì)二進(jìn)制文件輸入輸出,series是一種一維的數(shù)組型對(duì)象,它包含了一個(gè)值序列和一個(gè)數(shù)據(jù)標(biāo)簽
    2022-07-07
  • python?logging多進(jìn)程多線程輸出到同一個(gè)日志文件的實(shí)戰(zhàn)案例

    python?logging多進(jìn)程多線程輸出到同一個(gè)日志文件的實(shí)戰(zhàn)案例

    這篇文章主要介紹了python?logging多進(jìn)程多線程輸出到同一個(gè)日志文件的實(shí)戰(zhàn)案例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • python 3.3 下載固定鏈接文件并保存的方法

    python 3.3 下載固定鏈接文件并保存的方法

    今天小編就為大家分享一篇python 3.3 下載固定鏈接文件并保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python 的集合類型詳解

    python 的集合類型詳解

    這篇文章主要為大家介紹了python的集合類型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Python通用驗(yàn)證碼識(shí)別OCR庫(kù)之ddddocr驗(yàn)證碼識(shí)別

    Python通用驗(yàn)證碼識(shí)別OCR庫(kù)之ddddocr驗(yàn)證碼識(shí)別

    dddd_ocr也是一個(gè)用于識(shí)別驗(yàn)證碼的開源庫(kù),又名帶帶弟弟ocr,爬蟲界大佬sml2h3開發(fā),識(shí)別效果也是非常不錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Python通用驗(yàn)證碼識(shí)別OCR庫(kù)之ddddocr驗(yàn)證碼識(shí)別的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Pandas格式化DataFrame的浮點(diǎn)數(shù)列的實(shí)現(xiàn)

    Pandas格式化DataFrame的浮點(diǎn)數(shù)列的實(shí)現(xiàn)

    本文主要介紹了Pandas格式化DataFrame的浮點(diǎn)數(shù)列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • python中urllib模塊用法實(shí)例詳解

    python中urllib模塊用法實(shí)例詳解

    這篇文章主要介紹了python中urllib模塊用法,以實(shí)例形式詳細(xì)分析了python中urllib模塊代替PHP的curl操作方法,具有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • python復(fù)制列表時(shí)[:]和[::]之間有什么區(qū)別

    python復(fù)制列表時(shí)[:]和[::]之間有什么區(qū)別

    這篇文章主要給大家介紹了關(guān)于python復(fù)制列表時(shí)[:]和[::]之間有什么區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))

    利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))

    這篇文章主要給大家介紹了關(guān)于利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2018-03-03

最新評(píng)論

南木林县| 凤城市| 彭阳县| 景泰县| 铜陵市| 东乡县| 怀宁县| 怀远县| 白河县| 龙州县| 封丘县| 中西区| 渭南市| 贵德县| 溆浦县| 黎城县| 重庆市| 稷山县| 安岳县| 满洲里市| 习水县| 扎鲁特旗| 宁阳县| 安陆市| 博湖县| 西乌珠穆沁旗| 西和县| 霞浦县| 密山市| 沙洋县| 竹溪县| 永新县| 长沙县| 古田县| 樟树市| 南投市| 泊头市| 沙田区| 通许县| 平山县| 泾川县|