Pyparsing二维列表
我有以下的示例数据: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']]
任何援助将不胜感激。
您可以使用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]]
正是我所期待的!非常感谢! – user1599318
请注意,'pyparsing_common.integer'还包含一个分析动作来完成字符串到字符串的转换,因此您的整数可以在解析后立即作为整数使用。如果这不是你想要的,用'pp.Word(pp.nums)'替换。 – PaulMcG
你需要使用专门pyparsing? –
我的意思是技术上不适用于这部分,但是我将其用于我的文件的其余部分,它工作得很好 – user1599318