使用 pyparsing 和 nestedExpr 设置起点时遇到问题
Trouble with setting a start point with pyparsing and nestedExpr
抱歉这个新手问题,但这个问题一直让我抓狂,搜索了好几个小时都没有找到解决方案。
我有一个路由器配置输入文件,类似于:
groups {
...some nested info...
}
some text....
system {
...some nested info...
}
chassis {
...some nested info...
}
现在使用 pyparsing 和 nestedExpr,我可以解析第一部分 'groups' 并在列表中得到一组完美的列表,但我无法继续 'system' 或 'chassis'.
理想情况下,我想从 'chassis' 开始,只获取该部分的列表列表,仅此而已。
有没有办法让 pyparsing 和 nestedExpr 处理整个文件或从某个点开始?
我当前的代码非常简单,理想情况下我如何让它从 'chassis':
开始
from pyparsing import *
with open('newfile.txt') as routerFile:
test = routerFile.read()
expr = Word(alphas) + nestedExpr('{','}')
print expr.parseString(test)
好的,看来我搜索的还不够努力。
我相信这个 post 给了我答案 Parsing TCL lists in Python
当您只想解析较大文本的选定位时,您有几个选项。
一种是使用pyparsing的SkipTo
class.
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,如 中所述。
抱歉这个新手问题,但这个问题一直让我抓狂,搜索了好几个小时都没有找到解决方案。
我有一个路由器配置输入文件,类似于:
groups {
...some nested info...
}
some text....
system {
...some nested info...
}
chassis {
...some nested info...
}
现在使用 pyparsing 和 nestedExpr,我可以解析第一部分 'groups' 并在列表中得到一组完美的列表,但我无法继续 'system' 或 'chassis'.
理想情况下,我想从 'chassis' 开始,只获取该部分的列表列表,仅此而已。
有没有办法让 pyparsing 和 nestedExpr 处理整个文件或从某个点开始?
我当前的代码非常简单,理想情况下我如何让它从 'chassis':
开始from pyparsing import *
with open('newfile.txt') as routerFile:
test = routerFile.read()
expr = Word(alphas) + nestedExpr('{','}')
print expr.parseString(test)
好的,看来我搜索的还不够努力。
我相信这个 post 给了我答案 Parsing TCL lists in Python
当您只想解析较大文本的选定位时,您有几个选项。
一种是使用pyparsing的SkipTo
class.
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,如