python - 使用 Python 在嵌套结构中提取两个大括号之间的文本
问题描述
作为为飞行模拟器创建“任务生成器”的第一步,我希望能够提取任务模板的片段,以便我可以更改或删除一些内容,再次将其完全放置,从而生成一个新的“任务”文件. 我的 Python 技能很少。我不需要一个可行的解决方案,但想要一个进一步调查的方向。这是挑战:
这是输入文件的(简化)示例:
test_str = ("Group\n"
"{\n"
" Name = \"Group 1\";\n"
" Index = 2;\n"
" Desc = \"Description\";\n"
" Block\n"
" {\n"
" Name = \"Block 1\";\n"
" Index = 497;\n"
" XPos = 171568.472;\n"
" YPos = 0.000;\n"
" ZPos = 204878.718;\n"
" }\n"
"\n"
" Block\n"
" {\n"
" Name = \"Block 2\";\n"
" Index = 321;\n"
" XPos = 162268.472;\n"
" YPos = 0.000;\n"
" ZPos = 203478.718;\n"
" }\n"
"\n"
"}\n"
"\n"
"Group\n"
"{\n"
" Name = \"Group 2\";\n"
" Index = 5;\n"
" Desc = \"Description\";\n"
" Block\n"
" {\n"
" Name = \"Block 3\";\n"
" Index = 112;\n"
" XPos = 122268.472;\n"
" YPos = 0.000;\n"
" ZPos = 208878.718;\n"
" }\n"
"\n"
" Block\n"
" {\n"
" Name = \"Block 4\";\n"
" Index = 214;\n"
" XPos = 159868.472;\n"
" YPos = 0.000;\n"
" ZPos = 202678.718;\n"
" }\n"
"\n"
"}\n")
如您所见,该文件由许多可以分组的对象(“块”)组成。这是一个嵌套结构,因为组也可以分组(此处未显示)。如何根据名称隔离一个特定组?
因此,假设我只想在输出文件中使用“Group 2”,我希望得到以下结果:
Group
{
Name = "Group 2";
Index = 5;
Desc = "Description";
Block
{
Name = "Block 3";
Index = 112;
XPos = 122268.472;
YPos = 0.000;
ZPos = 208878.718;
}
Block
{
Name = "Block 4";
Index = 214;
XPos = 159868.472;
YPos = 0.000;
ZPos = 202678.718;
}
}
以及针对组内给定块的类似问题。
解决方案
我对 python 也很陌生,但我会尝试为你提出一个解决方案。我已将您复制test_str = ...
到 input.txt 文件并用 python 加载它,然后使用read()
方法重新创建字符串。我相信您正在寻找的是find()
返回您正在寻找的子字符串的确切位置的方法(在这种情况下 - 组和块)。找到所需的组或块后,您可以使用字符串切片,就像我在行blockData = allData[iWantThisBlock:nextBlock]
中使用的那样,仅将字符串的一部分存储到新变量中。下面的代码将从您的字符串中打印出块 1。您可以使用相同的方法从字符串中获取组、其他块或参数。我真的希望这至少对您有所帮助:)
import os
os.chdir('D:\\')
fileDir = 'D:\\input.txt'
inputFile = open(fileDir, 'r')
allData = inputFile.read()
iWantThisBlock = allData.find('Block 1')
nextBlock = allData.find('Block 2')
blockData = allData[iWantThisBlock:nextBlock]
print(blockData)
推荐阅读
- html - Carbon Design Systems UI Shell 组件在代码笔中不起作用
- python - 使用 GPU 训练 XGBoost 回归器时内核死机
- c - 无法调用函数而不陷入无限循环
- python - 上一个作业结束后如何添加调度程序作业
- python - 只能是存储在 pygame.sprite.Group 中的矩形对象
- javascript - 如何创建一个 javascript 函数,将用户输入的输入值组合起来并将它们放在一个短语中?
- node.js - 节点是否有任何进程间内存存储?
- protocol-buffers - 在 protobuf 文件中保留 //go:generate 注释
- react-native - 移动下一个屏幕时如何删除标题的动画?
- vba - DoCmd.FindRecord 揭示了什么以及如何获得它?