2017-04-03 73 views
1

我有以下的示例數據: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,除了最後一個條目之後沒有空格並且只有一個;

有人會知道pyparsing語法來解析這個嗎?我一直在嘗試以下幾行,但不匹配。

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'還包含一個分析動作來完成字符串到字符串的轉換,因此您的整數可以在解析後立即作爲整數使用。如果這不是你想要的,用'pp.Word(pp.nums)'替換。 – PaulMcG