利用python如何實(shí)現(xiàn)一個(gè)解析protobuf文件功能-創(chuàng)新互聯(lián)

本篇文章為大家展示了利用python如何實(shí)現(xiàn)一個(gè)解析protobuf文件功能,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為貢嘎企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),貢嘎網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

ply使用


簡介


如果你不是從事編譯器或者解析器的開發(fā)工作,你可能從未聽說過ply。ply是基于python的lex和yacc,而它的作者就是大名鼎鼎Python Cookbook, 3rd Edition的作者??赡苡行┡笥丫图{悶了,我一個(gè)業(yè)務(wù)開發(fā)怎么需要自己寫編譯器呢,各位編程大牛說過,中央決定了,要多嘗試新的東西。而且了解一些語法解析的姿勢,以后自己解析格式復(fù)雜的日志或者數(shù)學(xué)公式,也是非常有幫助的。

針對沒有編譯基礎(chǔ)的童鞋,強(qiáng)烈建議了解一些文法相關(guān)的基本概念。輪子哥強(qiáng)烈推薦的parsing techniques以及編譯龍虎鯨書,個(gè)人感覺都不適合入門學(xué)習(xí),在此推薦胡倫俊的編譯原理(電子工業(yè)出版社),針對概念的例子講解很多,很適合入門學(xué)習(xí)。當(dāng)然也不需要特別深入研究,知道詞法分析和語法分析的相關(guān)概念和方法就可以愉快的使用ply了。文檔鏈接: http://www.pchou.info/open-source/2014/01/18/52da47204d4cb.html

為了方便大家上手,以求解多元一次方程組為例,講解一下ply的使用。

例子說明

輸入是多個(gè)格式為x + 4y - 3.2z = 7的一次方程,為了讓例子盡可能簡單,做如下限制:

  • 每個(gè)方程含有變量的部分在等號(hào)左邊,常數(shù)在等號(hào)右邊
  • 每個(gè)方程不限制變量的個(gè)數(shù)以及變量的順序,但每個(gè)方程每個(gè)變量只允許出現(xiàn)一次
  • 變量的命令規(guī)則為小寫字母串(x y xx yy abc 均為合法變量名)
  • 變量的系數(shù)限制為整數(shù)和浮點(diǎn)數(shù),浮點(diǎn)數(shù)不允許1.4e8的格式,系數(shù)和變量緊鄰,且系數(shù)不能為0
  • 方程組和方程組之間用, ;隔開

學(xué)過線性代數(shù)的童鞋肯定知道,只需要將方程組抽象為矩陣,按照線性代數(shù)的方法就可以解決。因此只需要將輸入方程組解析成右邊的矩陣和變量列表即可,剩下的求解過程就可以交給線性代數(shù)相關(guān)的工具解決。

利用python如何實(shí)現(xiàn)一個(gè)解析protobuf文件功能

詞法解析

ply中的lex來做詞法解析,詞法解析的理論有一大堆,但是lex用起來卻非常直觀,就是用正則表達(dá)式的方式將文本字符串解析為一個(gè)一個(gè)的token,下面的代碼就是用lex實(shí)現(xiàn)詞法解析。

from ply import lex

# 空格 制表符 回車這些不可見符號(hào)都忽略
t_ignore = ' \t\r'

# 解析錯(cuò)誤的時(shí)候直接拋出異常
def t_error(t):
  raise Exception('error {} at line {}'.format(t.value[0], t.lineno))

# 記錄行號(hào),方便出錯(cuò)定位
def t_newline(t):
  r'\n+'
  t.lexer.lineno += len(t.value)

# 支持c++風(fēng)格的\\注釋
def t_ignore_COMMENT(t):
  r'\/\/[^\n]*'

# 變量的命令規(guī)則
def t_VARIABLE(t):
  r'[a-z]+'
  return t

# 常數(shù)命令規(guī)則
def t_CONSTANT(t):
  r'\d+(\.\d+)?'
  t.value = float(t.value)
  return t

# 輸入中支持的符號(hào)頭token,當(dāng)然也支持t_PLUS = r'\+'的方式將加號(hào)定義為token
literals = '+-,;='
tokens = ('VARIABLE', 'CONSTANT')


if __name__ == '__main__':
  data = '''
  -x + 2.4y + z = 0; //this is a comment
  9y - z + 7.2x = -1;
  y - z + x = 8
  '''

  lexer = lex.lex()
  lexer.input(data)
  while True:
    tok = lexer.token()
    if not tok:
      break
    print tok

本文題目:利用python如何實(shí)現(xiàn)一個(gè)解析protobuf文件功能-創(chuàng)新互聯(lián)
新聞來源:http://bm7419.com/article0/ddhhio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、定制網(wǎng)站、全網(wǎng)營銷推廣企業(yè)建站、網(wǎng)站排名商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)