2016-10-05 49 views
3

我試圖使用pyparsing來構建一個解析器,它將匹配任意嵌套的括號內的所有文本。如果我們考慮這樣的字符串:Pyparsing - 匹配最外面的嵌套括號集

"[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]" 

我想是一個解析器的方式匹配,它返回兩場比賽:

[ 
    "[A,[B,C],[D,E,F],G]", 
    "[H,I,J]" 
] 

我能做到幾分,工作這個版本使用原始文本界面來嵌套nestedExpr,但是當您的嵌套比OriginalTextFor表達式的數量更深時,這會中斷。

是否有直接的方法可以匹配由nestedExpr抓取的最外層表達式,還是一種修改其邏輯的方法,以便第一個配對匹配後的所有內容都被視爲純文本而不是被解析?

更新:有一兩件事似乎來接近我想要做到的是邏輯的,從nestedExpr這款改裝版:

def mynest(opener='{', closer='}'): 
    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS)) 
    ret = Forward() 
    ret <<= (Suppress(opener) + originalTextFor(ZeroOrMore(ret | content)) + Suppress(closer)) 
    return ret 

這讓我最的方式出現,雖然有一個額外的水平的列表包裝在那裏,我真的不需要,我真的很喜歡那些括號被包含在字符串中(沒有進入無限遞歸的情況下,不壓制它們)。

parser = mynest("[","]") 
result = parser.searchString("[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]") 
result.asList() 
>>> [['A,[B,C],[D,E,F],G'], ['H,I,J']] 

我知道我可以用一個簡單的列表理解去掉這些,但是如果我可以消除第二個冗餘級別,這將是理想的。

回答

2

不知道爲什麼,這是行不通的:

sample = "[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]" 

scanner = originalTextFor(nestedExpr('[',']')) 

for match in scanner.searchString(sample): 
    print(match[0]) 

打印:

'[A,[B,C],[D,E,F],G]' 
'[H,I,J]' 

什麼是其中「當你的嵌套比OriginalTextFor式的數量更深這打破」的情況呢?

+0

在parseAction上添加更改內部文本(執行一些自定義文本格式)時發生了什麼。 我想弄清楚的更大的問題是如何停止從一個嵌套列表中包裝單個結果,而不必使用列表comprehenson(因爲我的分析文本是巨大的,我想避免一個更多用於循環)。 –

+0

取消組合,也許? – PaulMcG