2017-10-26 12 views
-2

私はoutputファイルに何千もの情報が含まれています。しょっちゅう、私は次の形式パターンにマッチし、Pythonを使用して変数に保存

Input Orientation: 
... 
content 
... 
Distance matrix (angstroms): 

の出力ファイルの情報で見つける私は今、その後のフォーマットに変数にcontentを保存したいです。もう1つは、最後のパターンに興味があることです。私はsedawkでこれを行うための解決策を持っていますが、1つのジョブを実行するために複数のファイルを作成することにつながります。この仕事は、Pythonで行うことができるはずですが、私はどこから読んで始めてこれを学ぶべきか分かりません。私はいくつかの進歩を遂げている正規表現にまで読んで、それを信じるかどうかされています


EDIT !最初にファイルを1行ずつ読み込み、リストを逆順にしてから、そのリストを構成するすべての文字列を結合します。私は今や1つの大きな複数行の文字列で終わります。次に、reモジュールを使って正規表現r'Distance matrix(.*?)Input orientation'を作成します。私の最初のパターンは "Distance matrix"で、次に0個以上のすべての文字がマッチしているが、レイジーな方法でマッチ)、そして最後のパターン "Input orientation"を入力します。テストのための

with open(inputfile,"r") as input_file: 
     input_file_lines = input_file.readlines() 
     reverse_lines = input_lines[::-1] 
     string = ''.join(reverse_lines) 

     match = re.search('Distance matrix(.*?)Input orientation', string, re.DOTALL).group(1) 

サンプルデータファイル:

Item    Value  Threshold Converged? 
      Maximum Force   0.005032  0.000450  NO 
      RMS  Force   0.001066  0.000300  NO 
      Maximum Displacement  0.027438  0.001800  NO 
      RMS  Displacement  0.007282  0.001200  NO 
      Predicted change in Energy=-8.909077D-05 
      GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad 

             Input orientation: 
      --------------------------------------------------------------------- 
      Center  Atomic  Atomic    Coordinates (Angstroms) 
      Number  Number  Type    X   Y   Z 
      --------------------------------------------------------------------- 
        1   6   0  Incorrect Incorrect Incorrect 
        2   1   0  Incorrect Incorrect Incorrect 
        3   1   0  Incorrect Incorrect Incorrect 
        4   1   0  Incorrect Incorrect Incorrect 
        5   17   0  Incorrect Incorrect Incorrect 
        6   9   0  Incorrect Incorrect Incorrect 
      --------------------------------------------------------------------- 
           Distance matrix (angstroms): 
           1   2   3   4   5 
       1 C 0.000000 
       2 H 1.080163 0.000000 
       3 H 1.080326 1.809416 0.000000 
       4 H 1.080621 1.810236 1.810685 0.000000 
       5 Cl 1.962171 2.470702 2.468769 2.465270 0.000000 
       6 F 2.390537 2.343910 2.357275 2.380515 4.352568 
           6 
       6 F 0.000000 

              Input orientation: 
       --------------------------------------------------------------------- 
       Center  Atomic  Atomic    Coordinates (Angstroms) 
       Number  Number  Type    X   Y   Z 
       --------------------------------------------------------------------- 
         1   6   0  Correct Correct  Correct 
         2   1   0  Correct Correct  Correct 
         3   1   0  Correct Correct  Correct 
         4   1   0  Correct Correct  Correct 
         5   17   0  Correct Correct  Correct 
         6   9   0  Correct Correct  Correct 
       --------------------------------------------------------------------- 
            Distance matrix (angstroms): 
            1   2   3   4   5 
        1 C 0.000000 
        2 H 1.080516 0.000000 
        3 H 1.080587 1.801890 0.000000 
        4 H 1.080473 1.801427 1.801478 0.000000 
        5 Cl 1.936014 2.458132 2.459437 2.460630 0.000000 
        6 F 2.414588 2.368281 2.365651 2.355690 4.350586 
+0

これまでにPythonで何を試しましたか?これはあまりに複雑すぎるべきではありません。 – asongtoruin

+0

あなたは私がこの問題に関連して試したことを意味しますか?もしそうなら、何もしません。 – Yoda

+2

まず、あなた自身に何らかの努力を払うべきです。例えば、Pythonでテキストファイルを読む方法を知っていますか?それがあなたの最初の一歩です。 – asongtoruin

答えて

1

正規表現は、ここでは必要ありません。あなたが必要とするのは、良いオールインデックス作成だけです。 Pythonの文字列は、部分文字列を取り、テキスト内でそれを見つけ、部分文字列の最初の文字のインデックスを返します。index and rindex methodsです。 this docを読むと、文字列のスライスに慣れているはずです。プログラムは次のようなものになります:

with open(input_file) as f: 
    s = f.read() # reads the file as one big string 

last_block = s[s.rindex('Input'):s.rindex('Distance')] 

をそのコードの最後の行は、その'Input'の最初の発生は、我々がrindexを使用するので、ファイルの終わりから始まり、そしてフロントに向かって移動見つけてマーク整数としての位置。それは'Distance'と同じことをします。次に、それらの整数を使用して、それらの間にある文字列の一部だけを返します。あなたの例の場合には、それが戻ってくるファイル:あなたが'Input orientation'ヘッダをしたくない場合は、望ましい結果を得るまで、あなたは、単にrindex('Input')の結果に追加することができます

         Input orientation: 
      --------------------------------------------------------------------- 
      Center  Atomic  Atomic    Coordinates (Angstroms) 
      Number  Number  Type    X   Y   Z 
      --------------------------------------------------------------------- 
        1   6   0  Correct Correct  Correct 
        2   1   0  Correct Correct  Correct 
        3   1   0  Correct Correct  Correct 
        4   1   0  Correct Correct  Correct 
        5   17   0  Correct Correct  Correct 
        6   9   0  Correct Correct  Correct 
      --------------------------------------------------------------------- 

。たとえば、s[s.rindex('Input') + 19:s.rindex('Distance')]のように見えます。

部分文字列が見つからない場合、indexおよびrindexがエラーをスローすることに注意することも重要です。それが望ましくない場合は、findrfindを使用できます。

関連する問題