新聞中心
Spark 是一種用 Python 編寫的強(qiáng)大的、通用的解析器/編譯器框架。在某些方面,Spark 所提供的比 SimpleParse 或其它 Python 解析器提供的都要多,下面進(jìn)行學(xué)習(xí)研究。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)樅陽免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
然而,因?yàn)樗耆怯?Python 編寫的,所以速度也會(huì)比較慢。David 在本文中討論了 Spark 模塊,給出了一些代碼樣本,解釋了它的用途,并對其應(yīng)用領(lǐng)域提供了一些建議。本文中會(huì)介紹一些解析的基本概念,并對 Spark 模塊進(jìn)行了討論。解析框架是一個(gè)內(nèi)容豐富的主題,它值得我們多花時(shí)間去全面了解;
這兩篇文章為讀者和我自己都開了一個(gè)好頭。在日常的編程中,我經(jīng)常需要標(biāo)識(shí)存在于文本文檔中的部件和結(jié)構(gòu),這些文檔包括:日志文件、配置文件、定界的數(shù)據(jù)以及格式更自由的(但還是半結(jié)構(gòu)化的)報(bào)表格式。所有這些文檔都擁有它們自己的“小語言”,用于規(guī)定什么能夠出現(xiàn)在文檔內(nèi)。我編寫這些非正式解析任務(wù)的程序的方法總是有點(diǎn)象大雜燴。
其中包括定制狀態(tài)機(jī)、正則表達(dá)式以及上下文驅(qū)動(dòng)的字符串測試。這些程序中的模式大概總是這樣:“讀一些文本,弄清是否可以用它來做些什么,然后可能再多讀一些文本,一直嘗試下去。”
解析器將文檔中部件和結(jié)構(gòu)的描述提煉成簡明、清晰和說明性的規(guī)則,確定由什么組成文檔。大多數(shù)正式的解析器都使用擴(kuò)展巴科斯范式(Extended Backus-Naur Form,EBNF)上的變體來描述它們所描述的語言的“語法”。
基本上,EBNF 語法對您可能在文檔中找到的部件賦予名稱;另外,較大的部件通常由較小的部件組成。小部件在較大的部件中出現(xiàn)的頻率和順序由操作符指定。舉例來說,清單 1 是 EBNF 語法 typographify.def,我們在 SimpleParse 那篇文章中見到過這個(gè)語法(其它工具運(yùn)行的方式稍有不同):
- #-*- encoding: gb2312 -*-
- import quopri
- a = "only a test數(shù)據(jù)"
- b = quopri.encodestring(a) # 對字符串編碼
- print b
- print quopri.decodestring(b) # 對字符串解碼
- import StringIO
- c = StringIO.StringIO()
- d = StringIO.StringIO()
- e = StringIO.StringIO()
- c.write(a)
- c.seek(0)
- quopri.encode(c, d, 0) # 編碼StringIO中的數(shù)據(jù), 第三個(gè)參數(shù)0表示不對空格和tab符號(hào)編碼,為1表示進(jìn)行編碼
- print d.getvalue()
- d.seek(0)
- quopri.decode(d, e) # 解碼StringIO中的數(shù)據(jù)
- print e.getvalue()
- f1 = open("aaa.txt", "w")
- f1.write(a)
- f1.close()
- f1 = open("aaa.txt", "r")
- f2 = open("bbb.txt", "w")
- quopri.encode(f1, f2, 0) # 編碼aaa.txt中的數(shù)據(jù)到bbb.txt
- f1.close()
- f2.close()
- print open("bbb.txt", "r").read()
這里有一個(gè)有趣的地方。WordScanner 本身是一個(gè)完美的掃描程序類;但 Spark 掃描程序類本身可以通過繼承進(jìn)一步特化:子正則表達(dá)式模式在父正則表達(dá)式之前匹配,而如果需要,子方法/正則表達(dá)式可以覆蓋父方法/正則表達(dá)式。
所以,WordPlusScanner 將在 WordScanner 之前對特化進(jìn)行匹配(可能會(huì)因此先獲取一些字節(jié))。模式文檔字符串中允許使用任何正則表達(dá)式(舉例來說,.t_contraction() 方法包含模式中的一個(gè)“向后插入”)。查找記號(hào)的確有一點(diǎn)意思,但真正有意思的是如何向記號(hào)列表應(yīng)用語法。解析階段在記號(hào)列表的基礎(chǔ)上創(chuàng)建任意的樹結(jié)構(gòu)。它只是指定了表達(dá)式語法而已。
Spark 有好幾種創(chuàng)建 AST 的方法。“手工”的方法是特化 GenericParser 類。在這種情況下,具體子解析器會(huì)提供很多方法。方法名的形式為 p_foobar(self, args)。每個(gè)這樣的方法的文檔字符串都包含一個(gè)或多個(gè)模式到名稱的分配。只要語法表達(dá)式匹配,每種方法就可以包含任何要執(zhí)行的代碼。
分享文章:正群調(diào)整Python編寫速度
當(dāng)前URL:http://www.dlmjj.cn/article/djchihc.html


咨詢
建站咨詢
