首页 > 解决方案 > 使用 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

解决方案


我对 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)

推荐阅读