Fragen zu regulären Ausdrücken?

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.
wdsl
User
Beiträge: 35
Registriert: Donnerstag 22. Februar 2007, 16:26

Fragen zu regulären Ausdrücken?

Beitragvon wdsl » Dienstag 5. Juni 2007, 08:05

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Dienstag 5. Juni 2007, 09:17

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
BlackJack

Beitragvon BlackJack » Dienstag 5. Juni 2007, 09:42

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 5. Juni 2007, 10:14

Ich werfe mal Kodos ein, der einem helfen kann, Regex schneller nachzuvollziehen, zu entwickeln und zu testen.
wdsl
User
Beiträge: 35
Registriert: Donnerstag 22. Februar 2007, 16:26

Beitragvon wdsl » Dienstag 5. Juni 2007, 10:15

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
BlackJack

Beitragvon BlackJack » Dienstag 5. Juni 2007, 10:16

Das habe ich doch schon geschrieben -> `finditer()` oder `findall()`.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 5. Juni 2007, 13:35

Und hier noch ein Regex-Tool für Python, das aber im Browser läuft: http://cthedot.de/retest/
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Dienstag 5. Juni 2007, 14:34

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....
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Re: Fragen zu regulären Ausdrücken?

Beitragvon Joghurt » Dienstag 5. Juni 2007, 19:09

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], de_tom