Seite 1 von 1

Fragen zu regulären Ausdrücken?

Verfasst: Dienstag 5. Juni 2007, 08:05
von wdsl
Hi,
1. Warum geht dieser Ausdruck der Auskommentierte aber in die Hose?

Code: Alles auswählen

import re

string = "((bl: bla)(bl: bla)(bl: bla)(bl: bla)(bl: bla)(bl: bla)(bl: bla)(bl: bla)(bl: bla))"
print "String:" + string

regex = re.compile('\(\(((\S{2}): (.+))\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\)')
#regex = re.compile('^\(\(((\S{2}): (.+))\)+\)$')
m = regex.match(string)

print "=============================="
print "Group1" + m.group(1)
print "Group2" + m.group(2)
print "Group3" + m.group(3)
print "Group4" + m.group(4)
print "Group5" + m.group(5)
print "Group6" + m.group(6)
print "Group7" + m.group(7)
print "Group8" + m.group(8)
print "Group9" + m.group(9)
Und wie kann ich falls der 2. Ausdruck irgendwann mal gehen sollte durch alle Gruppen iterieren also alle anzeigen lassen wenn ich nicht weis wieviele Gruppen es gibt?
Werde aus der Doku irgendwie net so viel Schlauer ;-(


vielen Dank
wdsl

Verfasst: Dienstag 5. Juni 2007, 09:17
von veers
Zur Frage 1:
Was meinst du mit geht nicht? Was erwartest du denn von der Expression?
Zur Frage 2:

Code: Alles auswählen

for group in m.groups(): print group

Verfasst: Dienstag 5. Juni 2007, 09:42
von BlackJack
Die Anzahl der Gruppen entspricht der Anzahl der (nicht "escape"ten) Klammerpaare. Also hat der auskommentierte Ausdruck drei Gruppen und genau diese drei Gruppen gibt's auch als Ergebnis.

Bei Gruppen die wiederholt werden können, ist im Ergebnis immer der letzte Teil der passte. Also Beispielsweise '(.)+', da ist im Match bei jeder nicht-leeren Zeichenkette *eine* Gruppe mit dem letzten Zeichen der Zeichenkette. So etwas sieht man beim experimentieren übrigens besser, wenn man in den Testdaten nicht überall '(bl: bla)' verwendet.

Man könnte zum Testen ob die Zeile syntaktisch den gewünschten Aufbau hat r'\((\(\w{2}:.*?\))+\)' verwenden und dann mit r'\((\w{2}):(.*?)\)' und `re.finditer()` oder `re.findall()` die einzelnen Werte aus der Zeichenkette holen.

Verfasst: Dienstag 5. Juni 2007, 10:14
von Y0Gi
Ich werfe mal Kodos ein, der einem helfen kann, Regex schneller nachzuvollziehen, zu entwickeln und zu testen.

Verfasst: Dienstag 5. Juni 2007, 10:15
von wdsl
hmm heißt das, dass das gar nicht geht dynamisch viele Gruppen zu erzeugen?

Wie würdet ihr das dann am besten machen?

vielen Dank
wdsl

Verfasst: Dienstag 5. Juni 2007, 10:16
von BlackJack
Das habe ich doch schon geschrieben -> `finditer()` oder `findall()`.

Verfasst: Dienstag 5. Juni 2007, 13:35
von Y0Gi
Und hier noch ein Regex-Tool für Python, das aber im Browser läuft: http://cthedot.de/retest/

Verfasst: Dienstag 5. Juni 2007, 14:34
von mitsuhiko
Y0Gi hat geschrieben:Und hier noch ein Regex-Tool für Python, das aber im Browser läuft: http://cthedot.de/retest/
Woa. web2.0 hin oder her, aber sowas sollte eine Offline Anwendung sein....

Re: Fragen zu regulären Ausdrücken?

Verfasst: Dienstag 5. Juni 2007, 19:09
von Joghurt
wdsl hat geschrieben:regex = re.compile('\(\(((\S{2}): (.+))\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\((.+)\)\)')
#regex = re.compile('^\(\(((\S{2}): (.+))\)+\)$')
Du musst die Backslashes entweder Escapen oder mit raw-strings arbeiten:

Code: Alles auswählen

regex = re.compile('^\\(\\(.....') # schlecht
regex = re.compile(r'^\(\(....') # besser