【问题标题】:Trouble with setting a start point with pyparsing and nestedExpr使用 pyparsing 和 nestedExpr 设置起点时遇到问题
【发布时间】:2017-12-12 07:03:45
【问题描述】:

很抱歉这个新手问题,但这个问题一直让我发疯,并且搜索了很多小时都没有找到解决方案。

我有一个类似于以下内容的路由器配置输入文件:

groups {
...some nested info...
}
some text....
system {
...some nested info...
}
chassis {
...some nested info...
}

现在使用 pyparsing 和 nestedExpr,我可以解析第一部分“组”,并在列表中得到一组完美的列表,但我无法继续处理“系统”或“机箱”。

理想情况下,我想从“机箱”开始,只获取该部分的列表列表,仅此而已。

有没有办法让 pyparsing 和 nestedExpr 处理整个文件或从某个点开始?

我当前的代码非常简单,理想情况下如何让它从“机箱”开始:

from pyparsing import *    

with open('newfile.txt') as routerFile:
    test = routerFile.read()

    expr = Word(alphas) + nestedExpr('{','}')
    print expr.parseString(test)

【问题讨论】:

  • 'chassis' 是否嵌套在 'system' 中?还是应该是系统嵌套信息之后的'}'?
  • 是的,机箱和系统是分开的,现已修复,感谢您了解这一点

标签: python nested pyparsing


【解决方案1】:

当您只想解析较大文本的选定位时,您有几个选项。

一种是使用pyparsing的SkipTo类。

from pyparsing import Word, SkipTo

text = "AAA stuff I dont care about BBB more junk"

part1 = Word("A")
part2 = Word("B")
parser = part1 + SkipTo(part2) + part2

print(parser.parseString(text).asList())

打印

['AAA', 'stuff I dont care about ', 'BBB']

如果您真的不想要这些干扰,请使用SkipTo(part2).suppress()。

另一种选择文本的方法是使用 scanString 或 searchString 代替 parseString,如 this answer 中所述。

【讨论】:

    【解决方案2】:

    好的,看来我搜索的不够仔细。

    我相信这篇文章会给我答案Parsing TCL lists in Python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2012-07-02
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 2019-11-01
      • 2021-06-19
      相关资源
      最近更新 更多