0

需要在 python 中解析命令的输出。该命令返回类似这样的内容

A:
        2 bs found
        3 cs found
B:
        1 a found
        3 bs found
C:
        1 c found
        D:
                2 es found
                3 fs found

需要能够对输出执行以下操作:

访问 a.bs found ba found。cdes 找到等等。

我该怎么做这条蟒蛇?哪种数据结构最适合执行此操作?

本练习的目标是每 10 秒运行一次命令并确定更改内容的差异

4

2 回答 2

2

另一种解决方案是将输入字符串直接翻译成预先存在的库可以读取的内容。这个特定的数据看起来很适合 YAML。

在这种情况下re.sub('( +)([1-9]+) ([a-z]).+', '\\1\\3 : \\2', allcontent),您将 '2 cs found' 类型行重写为 pyYAML 理解的键:值映射。准确地说,'2 c found' 的形式变成了 'c : 2'

结果?

A:
        b : 2
        c : 3
B:
        a : 1
        b : 3
C:
        c : 1
        D:
                e : 2
                f : 3

执行yaml.load(newcontent)返回以下python数据结构:

{'A': {'b': 2, 'c': 3},
 'B': {'a': 1, 'b': 3},
 'C': {'D': {'e': 2, 'f': 3}, 'c': 1}}

这符合我之前评论中的建议。如果您更喜欢 json(Python 带有一个json模块),那么将这种策略改为生成 JSON 非常简单。

于 2013-05-17T01:51:20.410 回答
0

这应该有一个“解析”标签,因为它是一个一般的解析问题。

在这种情况下,通常的解决方案是跟踪 a) 缩进和 b) 当前正在解析的结构列表,正如您在行中阅读的那样。b 将作为一个包含单个空字典的列表开始,即。curparsing = [{}]

遍历所有输入线。例如:

with open('inputfilename','r') as f:
    for line in f:
        # code implementing the below rules.
  • 如果一行是空白 ( if not line.strip():),忽略它并转到下一行 ( continue)

  • 如果缩进级别降低了,我们应该删除当前解析列表中的顶部项目(即。curparsing.pop())。如果检测到多个减少,我们应该从顶部删除多个项目。

  • 去掉任何前导缩进line=line.lstrip()

  • 如果 ':' 在该行中,那么我们找到了一个子字典。读取key(':'左边的部分),增加缩进级别,新建一个字典,插入到当前列表顶部的字典中。然后将我们新创建的字典附加到列表中。

  • if line[0] in '123456789':然后我们发现了“找到[count] [character]s”的报告。我们可以使用正则表达式来查找计数和字符,其中m = re.match('([1-9]+) ([a-z])'); count, character = m.groups(); count = int(count). 然后我们将其存储到当前列表顶部的字典中:curparsing[-1][character] = count

差不多就是这样。您只需遍历行并将这些规则应用于每一行,最后curparsing[0]包含已解析的文档。

于 2013-05-17T01:25:45.567 回答