阅读包含在括号内的特定关键字的文本文件' {'

时间:2015-07-02 09:21:13

标签: python regex text-parsing brackets openfoam

我想阅读下面的文本文件。 它有几何名称 - > " hvac,OUTLET,INLET,Lamelle,duct and wall"

在这种情况下只有6,但我可能会根据CFD过程的不同模拟而有所不同。

我想只提取几何名称及其对应的'类型'。在我的例子中,几何和类型是" hvac,OUTLET,INLET,Lamelle,duct and wall"和"墙和补丁"分别

我应该使用Parse使用Parse还是只在' {\ n'之后搜索字符串和'} \ n'关键字。

geometry
{
    hvac
    {
        type            wall;
        inGroups        1(wall);
        nFaces          904403;
        startFace       38432281;
    }
    OUTLET
    {
        type            patch;
        nFaces          8228;
        startFace       39336684;
    }
    INLET
    {
        type            patch;
        nFaces          347;
        startFace       39344912;
    }
    Lamelle
    {
        type            wall;
        inGroups        1(wall);
        nFaces          204538;
        startFace       39345259;
    }
    duct
    {
        type            wall;
        inGroups        1(wall);
        nFaces          535136;
        startFace       39549797;
    }
    wall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          118659;
        startFace       40084933;
    }
}

1 个答案:

答案 0 :(得分:0)

答案取决于您是否要支持整个OpenFOAM的字典格式。

如果您只需要支持与问题中显示的格式类似的格式,那么像\b(\w+)\s+{\s+type\s+(\w+);这样的简单正则表达式可以执行:https://regex101.com/r/yV8tK2/1。如果您完全控制如何创建此词典,这可以是您的选择,但在这种情况下,您可以更简单地直接从创建词典的代码中获取所需信息。

然而,OpenFOAM的字典格式比你的例子丰富得多。它可以允许#include指令,允许正则表达式作为键,可以允许使用$语法引用其他键,可以允许注释,C ++代码片段以及可能更多(我不假装要好好了解)。一个典型的例子可以是两个词典:

---- File data.incl:

baseType wall;

---- File data

#inputMode merge;
#include "data.incl"

geometry {
    /* foo {    
        type wrongType; // a commented entry
    } */ 
    foo {
        type $baseType; // this will expand to wall
        ...
    }
    "(bar|buz)" {  // this will match bar and buz
         ...
    } 
}

如果你需要解析任何这样的字典,那么我强烈建议你用C ++编写代码并使用标准的OpenFOAM类,这样你就可以用几行代码来完成这个。