2015-04-05 32 views
2

我希望有人能指出一個方法來獲得pyparse處理數據的下面流:pyparse:如何處理「{foo bar n}」格式的流?

"text { \n line1 line1\n line2 line2\n \n }" 

在括號之間的信息,不過是爲了進一步分析後弦的斑點。我已經能夠完成的最好的方法是將skipTo與failOn屬性一起使用。

line = SkipTo(LineEnd(), failOn=(LineStart()+LineEnd())|'}') + LineEnd().suppress() 
nxos_clause = "with" + output_file + "{" + OneOrMore(line.setDebug()) + "}" 

調試顯示

Match {SkipTo:(LineEnd) Suppress:(LineEnd)} at loc 76(4,1) 
Exception raised:Found expression {{LineStart LineEnd} | "}"} (at char 94), (line:4, col:19) 
(1, 'failed parse:', 'Expected "}" (at char 77), (line:4, col:2)') 

輸出我找的是

"{", "line1 line1", "line2 line2", "}" 

我知道這是死的簡單手工做。我期待構建一個更復雜的語法,一旦我得到簡單的東西工作...

回答

1

如果換行符顯着,您需要將它們從pyparsing默認空白字符集中刪除。

from pyparsing import * 
ParserElement.setDefaultWhitespaceChars(' ') 

爲了抑制空行,定義匹配空行的表達式,匹配和鎮壓他們,檢測,查找是否有可能有內容系中的表達之前:

test = "text { \n line1 line1\n line2 line2\n \n }" 
NL = LineEnd().suppress() 

LBRACE,RBRACE = map(Literal, "{}") 
emptyLine = Suppress(Empty() + NL) 
line = SkipTo(NL) + NL 
nxos_clause = "text" + LBRACE + OneOrMore(~RBRACE + (emptyLine | line)) + RBRACE 

另外,還要注意我們不得不向前看OneOrMore,以免將右大括號視爲有效的非空行。

現在分析整個輸入線:

print nxos_clause.parseString(test) 

給出:

['text', '{', 'line1 line1', 'line2 line2', '}'] 
相關問題