2009-06-30 7 views
1

OK男/ギャルは私がエントリごとに複数の行を持つテキストファイルを持っている
簡単な何かに再び立ち往生リストに複数の行を読むと、データは次の形式パイソン -

firstword単語単語単語
でありますwordx単語単語単語interesting1単語単語単語単語
長ったらしい単語単語単語
wordz単語単語単語interesting2単語単語単語lastword

このシーケンスは100回くりかえされ、他のすべての単語はinteresting1とinteresting2から空白行を除いて同じです。 interesting2はinteresting1にではなく、他の何に関係あると私は2つの興味深いアイテムをリンクしたい、そのよう

interesting1 = interesting2
interesting1 = interesting2
interesting1 = interesting2
など、1 LNEとして、残りを捨てますシーケンスごとに

各行は別の単語で始まります
私の試みはファイルを読み込み、最初の興味深い行を特定するために "if wordx in line"ステートメントを実行して値をスライスし、 "行内のwordzならば)値をスライスしてtを連結する彼は最初の人と二番目。
グローバル変数、テンポラリ変数などを使用しなければならなかったのですが、最初の単語と最後の単語の間の範囲を特定し、それを単一のリストに入れ、両方の値を一緒にスライスする方法が必要です。

任意の提案は感謝している場合は、お時間に感謝

+4

サンプルコードがある場合は役に立ちます。 「面白い」ものをどのように判断するのかを判断するのは難しいです。それは常にインデックス4にありますか? – monkut

+2

monkutが言っているように、あなたは質問のために物事を簡素化しようとしましたが、残念なことに、何が何のように聞こえるかを理解することが非常に難しくなりました。実際のデータを含めるのを恐れてはいけないので、何が起きているのかを見ることができます。 – Oli

+0

申し訳ありません。面白い言葉は、スペースで区切られた、常に同じ位置にある単一のテキスト単語です。言葉遣いは敏感なので、バニラの言葉で置き換えられると見なされるかもしれません。興味深い1が国民の保険番号で、面白い2がステータスだった場合、残りの個人データは明確なものになりますか? –

答えて

0

を認め、繰り返しテキストと一致し、かつ興味深いビットのためのグループを持っている正規表現を作ります。次に、findallを使用してinteresting1とinteresting2のすべてのケースを見つけることができるはずです。

ので、同様:コメントで述べたように

text = open("foo.txt").read() 
RE = re.compile('firstword.*?wordx word word word (.*?) word.*?wordz word word word (.*?) word', re.DOTALL) 
print RE.findall(text) 

再 輸入は、isliceは間違いなくすっきり解決策ですが。

+0

あなたは4行目を意味すると仮定します。\ s * \ s + \ s + \ s + \ s * \ s + \ s + \ s + \ s + \ s + \ s + \ s + \ n ... OPには少しの助けが必要かもしれません。 –

+0

えええええええええええええええええええええええ、問題のテキストに実際にマッチする正規表現は必要ですが、そうではありません。その一部または複数の繰り返しに一致します。私はそれが\ s +の長い行を含む4行になる必要はありません。 どちらの場合でも、isliceはより良い解決策です。それでも、私は完全な解決策でそれを更新しました。 –

6
from itertools import izip, tee, islice 

i1, i2 = tee(open("foo.txt")) 

for line2, line4 in izip(islice(i1,1, None, 4), islice(i2, 3, None, 4)) : 
    print line2.split(" ")[4], "=", line4.split(" ")[4] 
0

データレイアウトの規則性をチェックするために、私はたくさんのアサーションを投入しました。

C:\SO>type words.py 

# sample pseudo-file contents 
guff = """\ 
firstword word word word 
wordx word word word interesting1-1 word word word word 
wordy word word word 
wordz word word word interesting2-1 word word word lastword 

miscellaneous rubbish 

firstword word word word 
wordx word word word interesting1-2 word word word word 
wordy word word word 
wordz word word word interesting2-2 word word word lastword 
firstword word word word 
wordx word word word interesting1-3 word word word word 
wordy word word word 
wordz word word word interesting2-3 word word word lastword 

""" 

# change the RHS of each of these to reflect reality 
FIRSTWORD = 'firstword' 
WORDX = 'wordx' 
WORDY = 'wordy' 
WORDZ = 'wordz' 
LASTWORD = 'lastword' 

from StringIO import StringIO 
f = StringIO(guff) 

while True: 
    a = f.readline() 
    if not a: break # end of file 
    a = a.split() 
    if not a: continue # empty line 
    if a[0] != FIRSTWORD: continue # skip extraneous matter 
    assert len(a) == 4 
    b = f.readline().split(); assert len(b) == 9 
    c = f.readline().split(); assert len(c) == 4 
    d = f.readline().split(); assert len(d) == 9 
    assert a[0] == FIRSTWORD 
    assert b[0] == WORDX 
    assert c[0] == WORDY 
    assert d[0] == WORDZ 
    assert d[-1] == LASTWORD 
    print b[4], d[4] 

C:\SO>\python26\python words.py 
interesting1-1 interesting2-1 
interesting1-2 interesting2-2 
interesting1-3 interesting2-3 

C:\SO>