reguläre ausdrücke mit python

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,
ich probiere nun schon ewig an einer Funktion, aber komme leider nicht weiter. (langsam überkommt mich das Gefühl das ich wahrscheinlich einfach den falschen Ansatz habe :oops: )
ich habe einen text in der variable text, innerhalb des Textes kommen mehrere Textgruppen vor <gallery> image:bla image:bla <gallery>. nun möchte ich mit der Funktion diese Gruppen finden und jeweils als image innerhalb der <gallery> Gruppierung umwandeln... hier was ich bis jetzt hab und ein bsp. Text.

TEXT:
== [[HLinear Electrical Network Domaineadline text]] ==
bla blubb
<gallery>
Image:Button_sup_letter.png
Image:Help.png
Image:Sca_c.gif
</gallery>
== Headline text ==
The Wiki uses a subset of '''TeX markup''', including some extensions from LaTeX and AMSLaTeX, for mathematical formulae. It generates either PNG images or simple HTML markup, depending on the complexity of the expression.
<math>x+y=34</math>
<math>cv+78=zt</math>
=Test3=
[[Image:Example.jpg]]3ze^^^^^923b91^2 lsdjfnaöoru qo
Meine Funktion:

Code: Alles auswählen

def doGallery(text):
	match = re.findall(r'\<\gallery\>(.*?)\<\gallery\>', text)
	for gal in match:
		print gal
	return match
so hier habe ich erstmal versucht zu gucken ob er <gallery> findet, aber tut er nicht :( im match steht nix drinne, oder habe ich es falsch ausgegeben? Wollte dann in der for schleife eine If-Abfrage machen umd dann Image:bla umzuwandeln...

Evtl. hat jemand auch eine Idee für einen alternativen Ansatz? Bin für alles offen...

Danke für Tipps und eure Hilfe
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,
mondschein hat geschrieben:<gallery>
Image:Button_sup_letter.png
Image:Help.png
Image:Sca_c.gif
</gallery>

Code: Alles auswählen

match = re.findall(r'\<\gallery\>(.*?)\<\gallery\>', text)
ich weiß nicht, was die ganzen Backslashes in deiner Regex zu suchen haben. Wirf die alle raus und das Tag am Schluss heißt </gallery>. Da du es hier mit mehreren Zeilen zu tun hast, musst du noch der findall-Funktion ein re.DOTALL als Argument mitgeben, damit '.*' auch auf Zeilenumbrüche matcht.

Gruß,
Manuel
BlackJack

Setz Dich mal mit den Flags für reguläre Ausdrücke auseinander, denn im Normalfall trifft der Punkt '.' nicht auf Zeilenenden zu. Ausserdem "escape"st Du das 'g' von 'gallery'!? Und im Beispiel hat das End-Tag noch einen Schrägstrich, der im regulären Ausdruck nicht vorhanden ist.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

also wegen <gallery>, dann so?

match = re.findall(r'<gallery>(.*?)</gallery>', text)
muss ich den backslash nicht "schützen"?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

mondschein hat geschrieben:also wegen <gallery>, dann so?

match = re.findall(r'<gallery>(.*?)</gallery>', text)
muss ich den backslash nicht "schützen"?
Nein, da du es hier erstens mit keinem Backslash zu tun hast, sondern mit einem Slash und zweitens, weil du es hier eh mit einem Raw-String zu tun hast (deswegen schreibst du ja ein 'r' vor den String).

So funktioniert die Geschichte allerdings noch nicht ganz.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

Code: Alles auswählen

    match = re.findall(r'<gallery>(.*?)<\gallery>', text, re.DOTALL)
TypeError: findall() takes exactly 2 arguments (3 given)
Was hab ich denn falsch gemacht? In nem Beispiel steht das:

Code: Alles auswählen

   threads = re.findall('tabindex.*?\s\s\s(.*?)</a>', unicode, re.DOTALL) 
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

More efficient than re.findall() is re.finditer(regex, subject). It returns an iterator that enables you to loop over the regex matches in the subject string: for m in re.finditer(regex, subject). The for-loop variable m is a Match object with the details of the current match.
ist dann nicht eigetnlich finditer für meine Zwecke besser? Was meint ihr?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

mondschein hat geschrieben:

Code: Alles auswählen

    match = re.findall(r'<gallery>(.*?)<\gallery>', text, re.DOTALL)
TypeError: findall() takes exactly 2 arguments (3 given)
Flags kannst du der findall-Funktion erst seit Python 2.4 mitgeben. Mach doch mal folgendes (ungetestet):

Code: Alles auswählen

import re
r = re.compile('<gallery>(.*?)</gallery>', re.DOTALL)
match = r.findall(text)
Zuletzt geändert von helduel am Freitag 25. April 2008, 11:50, insgesamt 1-mal geändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Bei mir mit Python 2.4 geht's:

Code: Alles auswählen

In [2]: txt = "<gallery> sdf sdf sdf </gallery>"
In [3]: re.findall(r'<gallery>(.*?)</gallery>', txt, re.DOTALL)
Out[3]: [' sdf sdf sdf ']
(wenn man noch den einen Backslash in einen Slash umdreht).

Was benutzt du fuer eine Python-Version?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

python2.3 :shock:
...mhm meinst du es liegt daran? weil die version kann/ darf ich nciht ändern, da ich keine entsprechenden Rechte hab. Was habe ich für andere Möglichkeiten, dass das Python-Programm erkennt, das der gesuchte reguläre Ausdruck über mehrere Zeilen geht?
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

also hab das nunmal mit finditer probiert:

Code: Alles auswählen

def doGallery(text):
	match = re.finditer(r'<gallery>(.*?)<\gallery>', text)	
       for hit in match: print hit.group()
       return match
da kommt aber der Fehler:
text = re.sub(r'(?s)<math>(.*?)</math>', encodeMath, text)
File "/usr/lib/python2.3/sre.py", line 143, in sub
return _compile(pattern, 0).sub(repl, string, count)
TypeError: expected string or buffer
Was heißt denn das? :?
BlackJack

Das heisst dass Du besser aufpassen musst und bitte Quelltext und Fehlermeldungen zeigen solltest, die auch *zusammen passen*. Der Fehler hat jedenfalls nichts mit dem gezeigten Quelltext zu tun, wie man an der ersten Zeile der Fehlermeldung ziemlich deutlich sehen kann.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

ach so ich hab vergessen zu schreiben das die erste zeile des fehlers direkt nach meinem dogallery kommt und wenn ich dogallery auskommentiert, ich keine fehler bekomme... :oops:
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

mondschein hat geschrieben:python2.3 :shock:
...mhm meinst du es liegt daran? weil die version kann/ darf ich nciht ändern, da ich keine entsprechenden Rechte hab. Was habe ich für andere Möglichkeiten, dass das Python-Programm erkennt, das der gesuchte reguläre Ausdruck über mehrere Zeilen geht?
Mach doch einfach mal das, was ich geschrieben hab.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

sorry das oben hatte ich gar nciht gelesen bzw. übersehen...jetzt funzt es super vielen vielen Dank (auch für die super Geduld mit mir) :!:
Antworten