2009-06-30 13 views
1

OK Jungs/Mädels Lesen stecken wieder auf etwas Einfaches
ich eine Textdatei, die mehrere Zeilen pro Eintrag ist, die Daten in folgendem Format istPython - mehrere Zeilen in Liste

Firstword Wort Wort Wort
wordx Wort Wort Wort interesting1 Wort Wort Wort Wort
wortreich Wort Wort Wort
wordz Wort Wort Wort interesting2 Wort Wort Wort Lastword

Diese Sequenz wiederholt sich etwa hundertmal, alle anderen Wörter sind gleich, abgesehen von interest1 und interest2, keine Leerzeilen. Die interesting2 ist relevant für interesting1 aber nicht auf etwas anderes und ich möchte die beiden interessante Elemente miteinander zu verbinden, um den Rest zu verwerfen wie

interesting1 = interesting2
interesting1 = interesting2
interesting1 = interesting2
etc, 1 lne pro Sequenz

Jede Zeile beginnt mit einem anderen Wort
mein Versuch, die Datei zu lesen und tut eine „if wordx in line“ Anweisung die erste interessante Linie zu identifizieren, in Scheiben schneiden Sie den Wert aus, die zweite Zeile finden, ("Wenn wordz in der Zeile) den Wert ausschneiden und t verketten er ist der Zweite mit dem Ersten.
Es ist jedoch ungeschickt, ich musste globale Variablen, temporäre Variablen usw. verwenden, und ich bin sicher, dass es eine Möglichkeit geben muss, den Bereich zwischen Firstword und lastword zu identifizieren und dann beide Werte zusammen zu schneiden.

Anregungen danken, Dank für Ihre Zeit

+4

Könnte helfen, wenn Sie einen Beispielcode haben. Es ist schwer zu sagen, wie Sie herausfinden wollen, was "interessant" ist. Ist es immer in Index 4? – monkut

+2

Wie Monkut sagt, hast du versucht, die Dinge für die Frage zu vereinfachen, und das hat es leider sehr schwer gemacht zu verstehen, was oder warum du tun möchtest, wie es sich anhört. Haben Sie keine Angst, echte Daten einzubauen, damit wir sehen können, was passiert. – Oli

+0

Entschuldigung. Das interessante Wort ist ein einzelnes Textwort, immer in der gleichen Position, durch Leerzeichen getrennt. Die Formulierung kann als empfindlich angesehen werden, daher die Ersetzung durch Vanillewörter. Wenn interesting1 eine nationale Versicherungsnummer und interesting2 ein Status wäre, der Rest wären persönliche Daten, würde das klären? –

Antwort

0

In diesem Fall eine regexp machen, die den sich wiederholenden Text übereinstimmt, und hat Gruppen für die interessanten Bits. Dann sollten Sie in der Lage sein, alle Fälle von interest1 und interesting2 zu finden.

Wie so: import re

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) 

Obwohl, wie in den Kommentaren erwähnt, ist die Islice definitiv eine sauberere Lösung.

+0

Angenommen, Sie meinen eine Vier-Zeilen-Re.VERBOSE-style regexp, mit der zweiten Zeile sowas wie \ s * wordx \ S + \ s + \ S + \ s + \ S + \ s + (\ S +) \ s + \ S + \ s + \ S + \ s + \ S + \ s + \ S + \ s * \ n ... das OP könnte ein bisschen Hilfe dabei brauchen. Wenn du es mit ein bisschen Erklärung buchstabierst und wie du es zwickst, solltest du wenigstens eine Up-Stimme bekommen ;-) –

+0

Äh ... nein, du brauchst nur eine Regexp, die tatsächlich mit dem fraglichen Text übereinstimmt, aber tu es nicht Teile davon oder mehrere Wiederholungen zusammenpassen. Ich sehe keine Notwendigkeit, dass es vier Zeilen auf langen Linien auf \ s + ... In jedem Fall ist der islice eine bessere Lösung. Trotzdem habe ich es mit einer kompletten Lösung aktualisiert. –

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

Ich habe eine Sack voll Behauptungen geworfen, um die Regelmäßigkeit Ihres Datenlayouts zu überprüfen.

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> 
Verwandte Themen