Seite 1 von 1

schlüsselbegriffe in text finden und per schleife durchgehen

Verfasst: Freitag 23. Mai 2008, 10:58
von mondschein
Hallo alle miteinander,
ich komm hier einfach nicht weiter ich glaub ich hab nen grundlegenden fehler gemacht, und hoffe das ihr mir evtl. ein paar Tipps gebt. Also ich hab einen Text:
bla bla bla
<gallery>
Image:Sca_c.gif|[[M63]]
Image:Mona Lisa.jpg|[[Mona Lisa]]
Image:Sca_c.GIF|[[M63]]
Image:Truite arc-en-ciel.jpg|Eine [[Forelle ]]
</gallery>
bla bla bla
So nun will ich den <gallery> Teil finden um dann pro "Image" eine Schleife zu durchlaufen.

Code: Alles auswählen

def doGallery(text):
	itext = text
	path  = "images"
	temp = re.compile('<gallery>(.*?)</gallery>', re.DOTALL)
	match = temp.findall(text)

	for gal in match:
		temp2  = re.compile('Image:(.*?)', re.DOTALL)
		match = temp2.findall(text)
		for im in match:
	
So das is der obere Teil des Programms, aber irgendwie findet er nix. Warum?
:shock:

Danke für jeden Tipp

Verfasst: Freitag 23. Mai 2008, 11:51
von mondschein
Ich hab noch eine Frage:

Wie mach ich das, dass er praktisch wenn er Image: gefunden hat alles was dahintersteht bis das nächste Image. anfängt, speichert?
Wil der Ausdruck wird ja immer so aussehen, dass das ganze Konstrukt von <galler> eingerahmt ist und dadrinn sind lauter image: bla.jpg Image: bla.gif etc.
Irgendwie hab ich nen Denkfehler :-(
Weil so wie ich es hab findet er alle 4 Image: aber die Liste enthält 4 leere Einträge
:cry:
Danke für jeden Hinweis

Verfasst: Freitag 23. Mai 2008, 12:08
von EyDu
Wenn es um XML geht, würde ich nicht per Hand suchen. Schau doch mal in die Doku und in die Forensuche. Da finden sich passende Module, die dir die Arbeit abnehmen.

Verfasst: Freitag 23. Mai 2008, 12:16
von mondschein
Ich versteh nicht genau wie du das meinst...Klar zum suchen arbeite ich mit Regulären Ausdrücken, aber XML? Ich versteh nicht wo der Bezug zwischen meinen Programm und XML liegt außer das man in Python und XML Reguläre Ausdrücke verwendet...
An sich arbeite ich nicht mit XML aber mit Wiki-Text, weil ich eine Erweiterung für ein Wikitool schreibe um den Wiki Text ind Latex umzuwandeln/ übersetzen und das ganze dann in PDF umzuwandeln.
kannst du nochmal genau erklären was du meinst?

Danke
Mondschein

Verfasst: Freitag 23. Mai 2008, 14:36
von BlackJack
@mondschein: Es wird etwas gefunden, und zwar leere Zeichenketten. In dem Ausdruck 'Image:(.*?)' suchst Du 'Image:' gefolgt von 0 mal oder mehrfach irgendeinem Zeichen. Das trifft halt auch auf die leere Zeichenkette zu, da wird irgendein Zeichen 0 mal wiederholt. :-)

Du musst das Fragezeichen raus nehmen, damit sich `re` nicht mit dem *kürzesten* Treffer zufrieden gibt und dann natürlich auch das `re.DOTALL` weglassen, damit der Match am Zeilenende aufhört.

Etwas sprechendere Namen wären nicht schlecht. Insbesondere sollte man nicht verschiedenen Sachen den gleichen nichtssagenden Namen (`match`) geben.

Wobei man das im gezeigten Quelltext auch ganz gut zusammen streichen kann:

Code: Alles auswählen

def doGallery(text):
    itext = text
    path = 'images'

    for gallery in re.findall(text, '<gallery>(.*?)</gallery>', re.DOTALL):
        for image in re.findall(text, 'Image:(.*)'):
            pass
Auf XML ist EyDu wohl wegen dem '<gallery>'-"Tag" gekommen.

Verfasst: Freitag 23. Mai 2008, 14:54
von mondschein
for gallery in re.findall(text, '<gallery>(.*?)</gallery>', re.DOTALL):
TypeError: findall() takes exactly 2 arguments (3 given)
Ich glaub ich hab nen püython versionsproblem, oder?

Verfasst: Freitag 23. Mai 2008, 15:02
von HWK

Code: Alles auswählen

New in version 1.5.2. Changed in version 2.4: Added the optional flags argument.
MfG
HWK

Verfasst: Freitag 23. Mai 2008, 15:26
von Leonidas
BlackJack hat geschrieben:Wobei man das im gezeigten Quelltext auch ganz gut zusammen streichen kann:

Code: Alles auswählen

def doGallery(text):
    itext = text
    path = 'images'

    for gallery in re.findall(text, '<gallery>(.*?)</gallery>', re.DOTALL):
        for image in re.findall(text, 'Image:(.*)'):
            pass
Müsste da in Zeile 6 nicht in ``gallery`` gesucht werden, statt in ``text``? Ich sehe dass der Quelltext vom OP übernommen ist, aber das scheint mir recht sinnlos zu sein, den Text mehrmals zu durchsuchen, wenn ``<gallery />`` mehrmals vorkommt.

Verfasst: Freitag 23. Mai 2008, 16:35
von mondschein
super danke...das is danna uch der grund warum er die schleife zu oft durchläuft...

danke dnake :oops:

Verfasst: Samstag 24. Mai 2008, 07:59
von BlackJack
@Leonidas: Jup, da habe ich nicht aufgepasst. Äh, ich meine natürlich ich wollte sehen ob alle anderen aufpassen und den absichtlich eingebauten Fehler bemerken… ;-)

Rcihtiger Suchbegriff?

Verfasst: Dienstag 27. Mai 2008, 09:27
von mondschein
Hallo,
danke nochmal für eure Hilfe, hab mein erstes Porblem nun bewältigt udn hängt jetzt mal wieder an nemwahrschienlich minimalen Fehler...
Ich habe ja:
Image:Sca_c.gif|[[M63]]
Image:Mona_Lisa.jpg|[[Mona Lisa]]
Image:Sca_c.GIF|[[M63]]
Image:Truite_arc-en-ciel.jpg|Eine [[Forelle ]]
Nun versuch ich schon die ganze Zeit praktisch den Untertitel der Bilder:
|[[M63]]
|[[Mona Lisa]]
|[[M63]]
|Eine [[Forelle ]]
zu finden. Aber meine Suchfunktion ist da irgendwie falsch bzw. Löschfunktion.

Code: Alles auswählen

titel = re.sub(r'\|\[\[.*\]\]' , '', im)
Das Programm löscht gar nichts und mir fällt auch grad auf das ich gar nciht den Fall abgedeckt hab, falls nach dem | Text ohne [[ kommt. :cry:

Danke für jeden Tipp.

arrays?

Verfasst: Dienstag 27. Mai 2008, 10:11
von mondschein
Hallo
ich hab nochmal ne Frage:
Ich wollt nen array anlegen und hab auch ein Tutorial (http://pentangle.net/python/handbook/node39.html) dazu gefunden, aber irgendwie klappt das mit den zero nicht, er sagt immer das es keine globale variable zero gibt.
Ich hab doch bestimmt vergessen das entsprechende Modul zu importieren, oder? Kann mir jemand sagen wie das heißt?

Danke :)

Verfasst: Dienstag 27. Mai 2008, 10:34
von OldBoy
Wenn du das Tutorial richtig liest, findest du in Kapitel 3.10 den Hinweis darauf, dass die Bibliothek Numeric verwendet wird. Der Nachfolger von Numeric ist Numpy.

Gruss

OldBoy

Verfasst: Dienstag 27. Mai 2008, 10:44
von Leonidas
Also bei mir funktioniert der reguläre Ausdruck, ich hätte ihn aber non-greedy gemacht. Und natürlich deckt er nur den Fall ab, wenn zwischen ``|`` und ``[[`` nichts steht.

Ansonsten finde ich es komisch, was du da für ein Dokument rauskramst. Willst du mit Vektoren rechnen? Die Dokumentation die du da hast ist nämlich an Physiker gerichtet.

Verfasst: Dienstag 27. Mai 2008, 10:48
von mondschein
:cry: hab ich auch schon gemerkt, hab jetzt http://docs.python.org/lib/module-array.html
aber irgendwie mit den arrays krige ich net so richtig hin, kannst du mir nen bsp. für die erstellung eines 2 dimensionalen arrays geben....kenne mich mit python nciht so aus, hab halt java gehabt und versuch nun schon die ganze zeit nen array hinzukriegen :? und es geht net, bin momentan soweit:

name_titel = array.array("B", range(length))

aber ehrlich gesagt versteh ich überhaupt net wozu die ganzen buchstaben da sind :( und der is ja dann eigentlich nur eindimensional... kannst du mir helfen? weil normal macht man ja nen array irgendwie in die Richtung
bla= array (8,8) oder so also für 2-d...

danke für jeden tipp

Verfasst: Dienstag 27. Mai 2008, 10:50
von mondschein
ok das war ne 8,8 da wo das smily is...

noch was anderes mit:
titel = re.sub(r'\|(\[)* \S (\]*)' , '', im)
müsst ich es doch eigentlich finden oder?! irgendwie macht er nix grad :(...
also ich mach's grad mit sub, damit ich sehe ob er es gefunden hat...

ne idee?

Verfasst: Dienstag 27. Mai 2008, 10:58
von Leonidas
Warum so kompliziert?

Code: Alles auswählen

re.sub(r'\|.*? \[\[.*?\]\]', '', 'Huhu|Eine [[Mona Lisa]]')
Und mondschein, lies doch bitte das Tutorial! Ehrlich, denn die Array-Frage die du stellst zeigt in meinen Augen, dass du kein Array suchst sondern eine Liste:

Code: Alles auswählen

l = [[1, 2], [3, 4]]
Das was ``array.array`` bietet sind echte Byte-Arrays in die nur Objekte eines Typs gespeichert werden können und dann eine exakte Byte-Darstellung haben, wie es auch in C aussehen würde.

Verfasst: Dienstag 27. Mai 2008, 11:04
von mondschein
mhm sorry, wenn du das denkst. Also ich kenn C nicht und soweit ich das noch aus den Java Stunden kenn, ist mir als erste Array eingefallen, weil die Adressierung zum ein- und auslesen kein ding ist und eigentlich gut zu meinem Problemfeld passen würde. Natürlich bin ich mir nciht sicher ob eine Java Array ehr einem Pythonarray oder einer Pythonliste entspricht, da ich mich mit Python relativ wenig auskenne, aber deshalb frag ich ja auch in diesem Forum, ob mir jemand diesbezüglich einen Tipp geben kann oder nen Link wo man das gut nachlesen kann.

Also meinst du das eine Liste um Fotonamen und zugehörige Titel abzuspeichern in Python besser geiegnet ist als ein ARRAY? Und wenn ja kennst du ein gutes Tutorial, wo man sich über die Implementierung Methoden etc. erkundigen kann?

Vielen Dank :wink:

Verfasst: Dienstag 27. Mai 2008, 11:14
von Leonidas
mondschein hat geschrieben:Also meinst du das eine Liste um Fotonamen und zugehörige Titel abzuspeichern in Python besser geiegnet ist als ein ARRAY?
Weder noch, dazu nimmt man ein Dict.
mondschein hat geschrieben:kennst du ein gutes Tutorial, wo man sich über die Implementierung Methoden etc. erkundigen kann?
Ja, das.

Verfasst: Dienstag 27. Mai 2008, 11:20
von BlackJack
Wenn man keine Abbildung von Fotonamen zu Titeln braucht und die Reihenfolge erhalten bleiben soll, dann ist eine Liste mit Tupeln auch geeignet.