2016-04-12 18 views
0

私は約80,000行の.ascファイルを持っています。ファイルからいくつかの特定の行を抽出したいと思います。'two' 2つの正規表現間の正規表現

私は情報/行(150個の領域)を抽出したい特定の行(前後に1つ)を置くことで、より簡単にしようとしました。これが発生したとき

「スタート」正規表現(MSG\s*(\d{1,8})\sSHOWING\sSENTENCE)ので、私はこれが

「終了」正規表現(MSG\s*(\d{1,8})\sSENTENCE\sGONE)を発生した後に行を見てみたいので、私は何も持っていません「スタート」正規表現が再び表示されるまで戻りました。

ありこれら二つの正規表現の式の間の線の数百人であってもよいが、私は、私はPythonでこれについてどのように行くだろうこれらの正規表現の

(EFIX\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3}).\d\s*(\d{1,3}).\d\s*(\d{1,4}) or (ESACC\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3}).\d\s*(\d{1,3}).\d\s*(\d{1,4}). 

に一致するものとなるでしょうか?

+0

はここでルビーで同様のQ&Aです:のhttp:/ /stackoverflow.com/questions/17457440/ruby-line-by-li ne-match-range Rubyは..演算子をサポートしています。 Pythonでは、ループでコード化する必要があります。しかし、同じQ&Aにもその例が含まれています。 –

+0

'EFIX ...'のパターンでは、 '.'はリテラルドットか1文字にマッチするドットですか? – Quinn

+0

リテラルドットはyesです(@ccf)。 ESACCのR 1075390 144.3 526.2 \t \t 54.3 \t 547.2 \t 1.86 \t 162:私はこのようになりますtypicall –

答えて

0

それは簡単に以下の手順で行うことができます。「スタート」正規表現と「終了」の正規表現パターンの間で

  1. キャプチャ内容。
  2. 試合:

    (EFIX\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3})\.\d\s*(\d{1,3})\.\d\s*(\d{1,4}) or (ESACC\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3})\.\d\s*(\d{1,3})\.\d\s*(\d{1,4})\.

だから、サンプルコードは次のようになります。

import re 

P1 = 'MSG\s*\d{1,8}\sSHOWING\sSENTENCE([\s\S]+?)MSG\s*\d{1,8}\sSENTENCE\sGONE' 
P2 = 'EFIX\sR\s*\d{1,8}\s*\d{1,8}\s*\d{1,3}\s*\d{1,3}\.\d\s*\d{1,3}\.\d\s*\d{1,4}|ESACC\sR\s*\d{1,8}\s*\d{1,8}\s*\d{1,3}\s*\d{1,3}\.\d\s*\d{1,3}\.\d\s*\d{1,4}\.' 
sample = """ 
ESACC R 000000 7777 333.3 222 1111. 
MSG 2355688 SHOWING SENTENCE 
some text in between 
EFIX R 5656 7878 123 456.8 122.9 5656 
some text 1 here 
some text 2 here 
ESACC R 1075390 1075414 25 144.3 526.2 54.3 547.2 1.86 162 
some text 3 here 
some text 4 here 
EFIX R 1212 505050 222 000.2 129.9 1010 
some text 1 here 
some text 2 here 
ESACC R 1212 505050 222 000.2 129.9 1010. 
some text 3 here 
some text 4 here 
MSG 2355688 SENTENCE GONE 
EFIX R 5555555 8888888 9 666.6 999.8 0000 
""" 
in_between = re.findall(P1, sample) 
for txt in in_between: 
    print re.findall(P2, txt) 

出力:

['EFIX R 5656 7878 123 456.8 122.9 5656', 'ESACC R 1075390\t1075414\t25\t144.3\t526.2\t54.', 'EFIX R 1212 505050 222 000.2 129.9 1010', 'ESACC R 1212 505050 222 000.2 129.9 1010.']