使用pyparsing分析稀疏ARFF时出错

2024-04-25 00:56:26 发布

您现在位置:Python中文网/ 问答频道 /正文

全部

我找到了一段代码来解析简单的ARFF文件,我想把它改成适合稀疏的ARFF,其数据如下:

@data
{0 12,4 37,8 First,20 'Some Thing'} 
{0 12,13 First,28 'Some Thing'}

代码如下:

^{pr2}$

但它不起作用

我想我必须告诉程序来识别这个wihtespace,但我不知道怎么做

非常感谢


Tags: 文件数据代码程序arffdatasomefirst
1条回答
网友
1楼 · 发布于 2024-04-25 00:56:26

不,不,不!pyparsing的一个重要部分是“发生空白”!除非您正在对基于缩进的解析或面向行的数据执行一些复杂的操作,否则不要在解析器定义中使用空白。在

你的问题是你定义的数据列表与你给它的列表不匹配。列表中的每个逗号分隔项都是一对值,似乎允许使用数字或带引号的字符串。因此,将数据列表定义为:

dataCell = realNum|ident|quotedString
dataList = Suppress('{') + Group( delimitedList(Group(dataCell + dataCell)))  + Suppress('}')

其他一些信息:

  • 没有必要将arffFormat转发声明为forward()。只有当数据将嵌套在递归结构(即包含子数据的数据)中时,才需要这样做。您的示例没有这个功能,只需在末尾用arffFormat = (...etc.

    定义arffFormat
  • x.setResultsName('name')已被简单的x('name')替换,真正清理解析器代码

  • 您定义了一个reanum(它需要一个小数点),但是示例中只有整数。我不再构建reanum类型的表达式,而是使用本地化的regex:realNum = Regex(r"[+-]?\d+(\.\d*)?([Ee][+-]?\d+)?")将提供一个接受整数或实数的表达式。这也允许你删除其他分散注意力的元素,比如arithSign。

你也可能在结果名称上做得太过火了。我认为这将使您对数据有一个很好的了解,并在最后给出一个非常简单的导航结构:

^{pr2}$

相关问题 更多 >