2016-10-05 14 views
3

私は任意の入れ子になった括弧のセット内のすべてのテキストに一致するパーサーを構築するためにpyparsingを使用しようとしています。私たちはこのような文字列を考慮した場合:パーサが邪魔に一致するのは2試合を返すこと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の弾幕を使用していますが、これは、入れ子がOriginalTextFor式の数よりも深いときにブレークします。

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 

余分なレベルがありますが、これは、私が道のほとんどを取得します。私が達成したいものに近づくように見えることの一つはnestedExprからロジックのこの修正版があります私が本当に必要としないリストラッピングのことです。私が本当に好きなのは、それらの括弧が文字列に含まれることです(それらを抑制しないことによって無限の再帰状態になることはありません)。

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番目の冗長レベルを排除できれば理想的です。

答えて

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を使わずに、ネストされたリストに1つの結果をラップするのを止める方法です(パースされたテキストが巨大で、もっとforループ)。 –

+0

、おそらく? – PaulMcG

関連する問題