2017-06-17 10 views
0

私は書き込み中のシミュレーションコード用のカスタム入力ファイルを解析しようとしています。プロパティ、値を持つネストされた "オブジェクト"で構成されています(リンクを参照)。再帰的にインデントレベルを考慮して正規表現を使用する

ここにはan example file and the regex I am using currentlyです。

各一致は、2つのキャプチャグループ、1つはプロパティの値、もう1つは値です。また、コメント区切り文字とプロパティ:値デリミタにそれぞれ対応するので、文字セットから「#」と「:」を除外します。

再帰的に構造に一致するように正規表現を変更するにはどうすればよいですか?つまり、ラインn + 1がラインnよりも高い識別レベルを有する場合、それはラインnのマッチのサブグループと一致しなければならない。

私はPCRE正規表現形式を使用するOctaveに取り組んでいます。

+0

あなたはfiを生産していますか?あなたが解析したいファイル、または例のようにそれを受け取っていますか? – chapelo

+0

私はそれを作成しますが、エンドユーザーは独自のパラメータで変更する必要がありますので、できるだけ単純で人間が読めるようにしておきたいと思います。 –

+1

PCREはキャプチャスタックをサポートしていないので、これで得られるのは、大文字と小文字の区別がついたものだけです。その後、値を分割して、同じ正規表現に対して再度一致させる必要があります。私はあなたが手動で簡単なパーサーを書いてそれを行うことが最善の策だと思います。 –

答えて

1

私はあなたが正規表現の代わりにYAMLを解析するのが非常に簡単なので、データ形式を制御できるかどうか質問しました。

唯一の問題は、オブジェクトがうまく形成されていないということです。

1)は、例えばregionsオブジェクトを取る、それがlayerそれらのすべてと呼ばれる多くの属性を持っています。あなたの意図は、同じ名前の多くのプロパティの代わりにlayerのリストを作成することだと思います。

2)対応する値を持つそれぞれのlayerプロパティを検討してください。各layerの後には、私が各層に属する孤児属性があります。

これらの考えを念頭に置いてください。 YAMLの規則にしたがってオブジェクトを作成すると、それを解析するのは簡単です。

私はあなたがOctaveで作業していることを知っていますが、私がデータに加えた変更と、それを解析するのがどれほど簡単であるかは、この場合はpythonです。

DATAあなたは今、あなたのオブジェクトが解析され得るだけでこれらの命令でYAML構文

case : 
    name : tandem solar cell 
    options : 
     verbose : true 
     t_stamp : system # a sample comment 
    units : 
     energy : eV 
     length : nm 
     time : s 
     tension : V 
     temperature: K 
     mqty : mole 
     light : cd 
    regions : 
     - layer : Glass # ADDED THE - TO MAKE IT A LIST OF LAYERS 
      geometry :  # AND KEEP INDENTATION PROPERLY 
       thick : 80 nm 
       npoints : 10 
      optical : 
       nk_file : vacuum.txt 
     - layer : FTO 
      geometry: 
       thick : 10 nm 
       npoints : 10 
      optical : 
       nk_file : vacuum.txt 

に準拠するために、DATA変形

case : 
    name : tandem solar cell 
    options : 
     verbose : true 
     t_stamp : system 
    units : 
     energy : eV 
     length : nm 
     time : s 
     tension : V 
     temperature: K 
     mqty : mole 
     light : cd 
    regions : 
     layer : Glass 
      geometry: 
       thick : 80 nm 
       npoints : 10 
      optical : 
       nk_file : vacuum.txt 
     layer : FTO 
      geometry: 
       thick : 10 nm 
       npoints : 10 
      optical : 
       nk_file : vacuum.txt 

ITを持っているように:

import yaml 
data = yaml.load(text) 

""" your data would be parsed as: 
{'case': {'name': 'tandem solar cell', 
      'options': {'t_stamp': 'system', 'verbose': True}, 
      'regions': [{'geometry': {'npoints': 10, 'thick': '80 nm'}, 
         'layer': 'Glass', 
         'optical': {'nk_file': 'vacuum.txt'}}, 
         {'geometry': {'npoints': 10, 'thick': '10 nm'}, 
         'layer': 'FTO', 
         'optical': {'nk_file': 'vacuum.txt'}}], 
      'units': {'energy': 'eV', 
        'length': 'nm', 
        'light': 'cd', 
        'mqty': 'mole', 
        'temperature': 'K', 
        'tension': 'V', 
        'time': 's'}}} 

""" 
+0

ありがとう、たくさん、matlab/octaveでこのpython dictを取得する最善の方法は何ですか? 構造体で変換する方法が見つかりませんでしたが、一貫性のある方法でそれらにアクセスできるとすれば十分でしょう。 –

+0

私はPythonをまったく使用する必要はないと思います。OctaveにはYAMLライブラリを使用し、適切なOctaveデータ構造に解析する必要があります。 – chapelo

関連する問題