亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 1731 0

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

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

按照書(shū)上所說(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)記輸出的開(kāi)始和結(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 ' ... '
??? 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 '
  • '
    ??? def end_listitem(self):
    ??????? print '
  • '
    ??? 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

    這個(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è)模塊,拋開(kāi)那祖父類不說(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à)到類圖里面看會(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è)也歸功于前面在寫(xiě)規(guī)則和過(guò)濾器時(shí)每一種類型的規(guī)則(過(guò)濾器)都單獨(dú)的寫(xiě)成了一個(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í)是和前面寫(xiě)的呼應(yīng)一下,就是在遍歷規(guī)則的時(shí)候通過(guò)調(diào)用condition這個(gè)東西來(lái)判斷是否符合當(dāng)前規(guī)則。

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

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

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

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

    python的即時(shí)標(biāo)記項(xiàng)目練習(xí)筆記_第1張圖片


    更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

    微信掃碼或搜索:z360901061

    微信掃一掃加我為好友

    QQ號(hào)聯(lián)系: 360901061

    您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

    【本文對(duì)您有幫助就好】

    您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

    發(fā)表我的評(píng)論
    最新評(píng)論 總共0條評(píng)論
    主站蜘蛛池模板: 色人久久 | 久久久久成人精品一区二区 | 亚洲伊人精品 | 久久毛片视频 | 国产高清美女一级a毛片久久w | 欧美日韩国产片 | 亚洲高清在线mv | 久久riav国产精品 | 国产高清不卡一区二区 | 日韩亚洲精品不卡在线 | 国产区一区 | 国产精品久久久久无毒 | 亚洲欧美在线视频免费 | 一级毛片免费视频日本 | 四虎免费播放观看在线视频 | 国产亚洲一区二区在线观看 | 亚洲欧美不卡中文字幕 | 成人小视频在线播放 | 天天爽夜夜操 | 国产高清天干天天视频 | 国产不卡视频在线 | 久久天天躁日日躁狠狠躁 | 免费播放欧美毛片欧美aaaaa | 国产一二视频 | 毛茸茸成熟女性老太的女bbww | 四虎影视最新网址 | 色综合久久中文色婷婷 | 男人叼女人的痛爽视频免费 | 欧美黑人乱大交ⅹxxxxx | 91视频网址 | 四虎影视永久在线 | 欧美xxxx喷潮 | 亚洲综合干 | 欧美亚洲国产成人综合在线 | 久久久久影视 | 999在线视频 | 99麻豆久久久国产精品免费 | 成人a毛片免费视频观看 | 久久99精品这里精品动漫6 | 国产激情影院 | 国偷盗摄自产福利一区在线 |