【问题标题】:Reading text file for specfic keyword included inside brackets '{'读取括号'{'内包含的特定关键字的文本文件
【发布时间】:2023-03-22 16:45:01
【问题描述】:

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

本例中只有6个,但我可能会根据模拟CFD过程的不同而有所不同。

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

我应该使用 Parse using XML 还是只搜索 '{\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;
    }
}

【问题讨论】:

  • 您不想使用 c++ 和标准 OpenFOAM 类?
  • 这个字典是怎么生成的?因为在一般情况下,由于 OpenFOAM 以字典格式提供了丰富的可能性,问题并不那么简单。例如,考虑条目值中的$-references,例如baseType wall; .... duct { type $baseType; ... }
  • 您可以使用foamDictionary 实用程序。它是为此目的而设计的

标签: python regex text-parsing brackets openfoam


【解决方案1】:

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

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

但是,OpenFOAM 的字典格式比您的示例丰富得多。它可以允许#include 指令,可以允许正则表达式作为键,可以允许使用$ 语法引用其他键,可以允许 cmets、C++ 代码 sn-ps 以及可能更多(我不假装知道好吧)。一个典型的例子可以是两个字典:

---- 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 类,这样您只需几行代码即可完成此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2017-10-25
    • 1970-01-01
    • 2023-02-21
    • 2021-12-25
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多