【问题标题】:Python simple brackets parserPython简单括号解析器
【发布时间】:2016-12-09 00:19:18
【问题描述】:

我基本上有一个这样结构的文件:

root \
{
  field1 {
    subfield_a {
      "value1"
    }
    subfield_b {
      "value2"
    }
    subfield_c {
      "value1"
      "value2"
      "value3"
    }
    subfield_d {
    }
  }
  field2 {
    subfield_a {
      "value1"
    }
    subfield_b {
      "value1"
    }
    subfield_c {
      "value1"
      "value2"
      "value3"
      "value4"
      "value5"
    }
    subfield_d {
    }
  }
}

我想用 python 解析这个文件以获得一个多维数组,其中包含特定子字段的所有值(例如 subfield_c)。例如。 :

tmp = magic_parse_function("subfield_c",file)
print tmp[0] # [ "value1", "value2", "value3"]
print tmp[1] # [ "value1", "value2", "value3", "value4", "value5"]

我很确定我必须使用 pyparsing 类,但我不知道从哪里开始设置正则表达式 (?) 表达式。有人可以给我一些指示吗?

【问题讨论】:

  • 如果您的输入像您发布的示例一样简单,您甚至不需要 pyparsing,您可以尝试编写自己的标记器来管理堆栈以了解其深度。 Here某人用括号做,没有内容。你觉得你可以尝试适应这种情况吗?如果没有,我可以尝试提供更多指示。 (顺便说一句:正则表达式无法计数,因此在尝试将它们用于此类任务时要小心)
  • 您究竟是如何在 Python 中修改字符串的,我很好奇? :)
  • 基本上我已经删除了\n,用普通括号替换了大括号,我已经删除了“\t”。然后我试图弄清楚如何只提取我需要的东西,但这没什么大不了的。困难的部分是拥有一个包含正确信息的数组。
  • 如果您找到了可行的解决方案,最好将其发布为您自己问题的答案 :)
  • 是的,我正在努力,我正在尝试编写“magic_parse_function”。完成后,我将发布解决方案。问题是我只想有一个特定的深度,但函数返回所有内容。

标签: python parsing


【解决方案1】:

您可以让 pyparsing 处理输入的匹配和迭代,只需定义您希望它匹配的内容,并将其作为字符串传递给文件主体:

def magic_parse_function(fld_name, source):
    from pyparsing import Keyword, nestedExpr

    # define parser
    parser = Keyword(fld_name).suppress() + nestedExpr('{','}')("content")

    # search input string for matching keyword and following braced content
    matches = parser.searchString(source)

    # remove quotation marks
    return [[qs.strip('"') for qs in r[0].asList()] for r in matches]

# read content of file into a string 'file_body' and pass it to the function
tmp = magic_parse_function("subfield_c",file_body)

print(tmp[0])
print(tmp[1])

打印:

['value1', 'value2', 'value3']
['value1', 'value2', 'value3', 'value4', 'value5']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 2013-01-06
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多