2012-03-12 12 views
1

正規表現を使用して単語PATTERNと一致させたいテキストファイルがあり、STARTENDの間のテキスト(以下に示すテキストファイル)を抽出します。私はその部分にランダムなデータがあるので、STARTENDのフィールドを直接一致させたくないですが、PATTERNは変わりませんので、簡単に一致させることができます。私は、パターンに一致することができる素早く汚れたPythonスクリプトを持っていますが、私は次のステップで立ち往生しています。最初の空行で読むときPythonのテキストファイルから正規表現を含むファイルのスニペットを読み取る

HERE IS MY PATTERN: 


     IGNORE SECTION 

************************************************** 
START 1 2 3 4 5 
    .  . . . . . 
    .  . . . . . 
    .  . . . . . 
END  . . . . . 



TEXT FILE CONTINUES........... 
. 
. 
. 
. 

************************************************** 

は、どのように私は5本のラインパターン下の行に読んへのPythonを伝え、そしてSTOPていますか?ここで

は私のスクリプトです:

#!usr/bin/env python 

import re 

pattern = r'PATTERN:'+'$' 

count = 0 
fp = open('fileinput.txt') 
for line in fp: 
    count += 1 

    match = re.search(pattern,line) 
    if match: 
     print 'Matched text:', line, 'Line', count 
     line_match = count 

new_line = line_match+4 

私は私が欲しいの行をマークしたが、それは空行に当たったときに、この時点からファイルの読み込みを開始し、終了するのPythonを伝えることはできません。任意のヒント?

+0

となります。 'nt'変数は無駄です。 – rubik

+0

必要なデータを抽出する前にファイル全体を読み取る必要がありますか?解決策は、 'line_match = count'の直後に' break'を使ってループから抜けることが考えられます。 – ChrisP

+0

@ChrisP正規表現にマッチする前に、ファイル全体を少なくとも一度は読む必要がありますか?試合が終わると、私は5行下に行き、NEXTの空行まで読み続けます。だからこの場合は、「START」と「END」の間にテキストを入れてください。 – prrao

答えて

2

私はあなたが実際にあなただけのendswithを使用することができ、すべてで正規表現を必要としないと思います。ここで私はそれを実装する方法です。その拡張可能な、それはあなたが望むものをしない:あなたはSTARTPATTERN後5行が起こることを知っているので

matching = False 
found = [] 
with open('fileinput.txt', 'r') as file 
    it = iter(file) 
    for line in it: 
     if matching: 
      if line.strip() == '': 
       break 
      else: 
       found.append(line) 
     elif line.endswith('PATTERN:'): 
      for _ in range(6): 
       next(it) 
      matching = True 

は、それを検索する必要はありませんので、代わりに私が期待されるところ、それがあることを確認するassertを使用。一致する行はfoundに保存され、

for line in found: 
    print line 
+0

毎回「START」と「END」がある場合、このアプローチは素晴らしいです。私は実際に私の実際のデータのそれらの位置にランダムな浮きを持っています。この例では 'START'と' END'を使って私の質問をより簡単に枠に入れました。 私は 'PATTERN'だけにマッチし、チェックを行わずに直接5行下を見たいと思っています。その後、「START」行から、「END」の下の空白行が表示されるまで、読書を続けます。 – prrao

+0

'for line in file'を使ってPythonに特定の行からの読み込みを要求する方法はありますか?私は 'readlines()[startline:endline]'を簡単に使うことができましたが、空の行にヒットしたときに 'break'を指定する方法はありません。それが私が立ち往生した場所です – prrao

+1

STARTとENDはプレースホルダだけであることに気付かなかった - 私は答えが更新されたので今すぐ動作するはずです。しかし、あなたは 'PATTERN'を検索しますが、pythonはその時点までファイルを読み込む必要があるので、どこから始めるべきかを教えて何の効果も得られません。 – aquavitae

0

私はあなたの説明をうまく理解できませんでした。私が理解できるものから、あなたは次のものを必要とします:

1)ファイルを特定のパターンから空の行まで読みます。
2)読み取​​られた部分を複数行のパターンに一致させます。この達成するために

1)readline()readlines()xreadlines()またはfor line in fileで単一の変数に関心のあるすべてのテキストを読む - 最も便利であるものは何でも。
ループはいつでもbreakで停止することができ、xreadlines()は読み込みを停止することができます。次に呼び出されると、ファイル内の現在の位置から開始します。
2)\nのパターンと一致させるか、改行に合わせて.が必要な場合はre.Mフラグを使用してください。

for l in f: 
    if re.match("PATTERN:\n",l): break 
s="" 
for l in f: 
    if l=='\n': break 
    s+=l 
m=re.match("<whatever-pattern-matches-your-chunk-of-text>",s) 
+0

私は、 'for line in file'アプローチが次に呼び出されたときに同じ行から継続しているとは考えていませんでした。それは素晴らしいことです。とにかく、新しい正規表現を指定しなくても、直接5行下のファイルを読み始めることはありますか? – prrao

+0

'for i in range(5):s + = f.readline()'は 'f'の現在の位置から' s'にちょうど5行を読み込みます。 * 5行をスキップする必要がある場合は、どこにでも結果を保存せずに読み込みます。 (考えてみましょう:5行目の終わりの位置を知るためにデータを読んでいますか?)) –

+0

何らかの理由で上記のforループが機能していません。次のエラーが表示されます: 'ValueError:反復と読み込みメソッドを組み合わせるとデータが失われます。 ' それ以降のバージョンのPythonとは関係がありますか?私はv2.7を使用しています – prrao

関連する問題