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

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:

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

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

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

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

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

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

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
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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
Antworten