2017-04-03 15 views
1

Iは、次のサンプルデータを有する:Pyparsing二次元リスト

165 150 238 402 395 571 365 446 284 278 322 282 236 
16 5 19 10 12 5 18 22 6 4 5 
259 224 249 193 170 151 95 86 101 58 49 
6013 7413 8976 10392 12678 9618 9054 8842 9387 11088 11393; 

それは(各行、列の等しい量を有していない以外は)二次元アレイの等価です。各行の最後にスペースがあり、最後に\nがあり、最後に空白がなく、;だけが続きます。

これを構文解析するための文法を知っている人はいますか?私は次の行に沿って何かを試してきましたが、それは一致しません。

data = Group(OneOrMore(Group(OneOrMore(Word(nums) + SPACE)) + LINE) + \ 
      Group(OneOrMore(Word(nums) + SPACE)) + Word(nums) + Literal(";") 

[['165', '150', '238', '402', '395', '571', '365', '446', '284', '278', 
'322', '282', '236'], ['16', '5', ... ], [...], ['6013', ..., '11393']] 

どのような援助を以下のように、所望の出力が理想的であろうが大幅に高く評価されるだろう。

+0

あなたは、具体的pyparsingを使用する必要がありますか? –

+0

私は技術的にはこの部分ではないことを意味しますが、私はそれをファイルの残りの部分に使用していて、それはかなりうまく動作しています – user1599318

答えて

2

stopOn引数をOneOrMoreに使用すると、一致を停止できます。次に、改行はデフォルトでスキップ可能な空白であるため、次のグループはマッチングを開始し、改行をスキップして次の整数から開始します。あなたのサンプルデータにこれを適用する

import pyparsing as pp 

data_line = pp.Group(pp.OneOrMore(pp.pyparsing_common.integer(), stopOn=pp.LineEnd())) 
data_lines = pp.OneOrMore(data_line) + pp.Suppress(';') 

data = """\ 
165 150 238 402 395 571 365 446 284 278 322 282 236 
16 5 19 10 12 5 18 22 6 4 5 
259 224 249 193 170 151 95 86 101 58 49 
6013 7413 8976 10392 12678 9618 9054 8842 9387 11088 11393;""" 

parsed = data_lines.parseString(data) 

from pprint import pprint 
pprint(parsed.asList()) 

プリント:

[[165, 150, 238, 402, 395, 571, 365, 446, 284, 278, 322, 282, 236], 
[16, 5, 19, 10, 12, 5, 18, 22, 6, 4, 5], 
[259, 224, 249, 193, 170, 151, 95, 86, 101, 58, 49], 
[6013, 7413, 8976, 10392, 12678, 9618, 9054, 8842, 9387, 11088, 11393]] 
+0

私が探していたものです!どうもありがとうございます! – user1599318

+0

'pyparsing_common.integer'には、文字列からintへの変換を行うための解析アクションも含まれているので、解析後すぐに整数をintとして使用できることに注意してください。それがあなたが望むものでないなら、 'pp.Word(pp.nums)'に置き換えてください。 – PaulMcG