schlüsselbegriffe in text finden und per schleife durchgehen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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
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.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Code: Alles auswählen

New in version 1.5.2. Changed in version 2.4: Added the optional flags argument.
MfG
HWK
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

super danke...das is danna uch der grund warum er die schleife zu oft durchläuft...

danke dnake :oops:
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… ;-)
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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 :)
OldBoy
User
Beiträge: 41
Registriert: Samstag 12. Januar 2008, 20:39

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

: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
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

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:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Wenn man keine Abbildung von Fotonamen zu Titeln braucht und die Reihenfolge erhalten bleiben soll, dann ist eine Liste mit Tupeln auch geeignet.
Antworten