Seite 1 von 1
re multiple matches
Verfasst: Dienstag 19. Januar 2010, 17:18
von jbs
If a group matches multiple times, only the last match is accessible:
Nun möchte ich aber alle groups haben, geht das?
Also konkret:
Am Ende möchte etwas wie `[('3','a',), ('2','b'),('4','c')]` und die Summe
herausbekommen. Mein re findet allerdings nur `4 c`.
Verfasst: Dienstag 19. Januar 2010, 17:22
von derdon
Code: Alles auswählen
>>> text = '''3x a
... 2x b
... 4x c'''
>>> for line in text.splitlines():
... print re.findall(r'(\d)x ([a-zA-Z])', line)
...
[('3', 'a')]
[('2', 'b')]
[('4', 'c')]
In einer entsprechenden Funktion dann als Generator (also yield statt print) schreiben.
Verfasst: Dienstag 19. Januar 2010, 17:53
von jbs
Nun kann es aber vorkommen, dass vor `Einkaufsliste` und nach `Summe` weitere Sachen wie `3x a` vorkommen können.
Verfasst: Dienstag 19. Januar 2010, 17:57
von Dav1d
Dann kannst du 2 verwenden, eine regex für Einkaufsliste...Summe, dann mit einer 2. so wies derdon vorgeschlagen hat
Verfasst: Dienstag 19. Januar 2010, 17:58
von jbs
Die davor und danach sollen nicht mitgezählt werden. Hätte mal mein Problem genauer beschreiben sollen.
Verfasst: Dienstag 19. Januar 2010, 22:44
von derdon
Also brauchst du
http://paste.pocoo.org/show/167291/ + meinen Code oben. Über Kritik zu dem Skript freue ich mich natürlich, da er mir nicht super-elegant vorkommt.
Hier ein Beispielaufruf:
Code: Alles auswählen
$ ./extract_contents.py testdatei --start='Einkaufsliste\n' --end='\nSumme: \d+?'
3x a
2x b
4x c
Edit: Streams kann man nicht seeken ->
http://paste.pocoo.org/compare/167296/167291/ 
Edit2: re.compile kann ich natürlich auch weglassen ->
http://paste.pocoo.org/compare/167302/167296/
Verfasst: Dienstag 19. Januar 2010, 22:57
von jbs
Warum gehst du denn Umweg über die Datei?
Code: Alles auswählen
def extract_contents(source, start, end):
seek_start = re.search(start, source).end()
seek_end = re.search(end, source).start()
return source[seek_start:seek_end]
Ich hab das mal so zusammengekürzt

.
Verfasst: Dienstag 19. Januar 2010, 23:04
von derdon
Ganz einfach: Weil ich davon ausgegangen bin, dass du mit Dateien arbeitest.

Verfasst: Dienstag 19. Januar 2010, 23:08
von EyDu
derdon hat geschrieben:Ganz einfach: Weil ich davon ausgegangen bin, dass du mit Dateien arbeitest.

Dann sollte man vorher die Datei einlesen und die Daten als Funktionsparameter weitergeben

Verfasst: Dienstag 19. Januar 2010, 23:09
von jbs
Was ich meinte ist, warum liest du die Datei komplett ein, um sie dann erneut auszulesen. Du hast deinen Inhalt doch in source gespeichert. Da ist es doch einfacher da ein Slice zu benutzen, als dies bei der Datei zu machen.
Verfasst: Dienstag 19. Januar 2010, 23:36
von jbs
@derdon: Danke für deinen Code!
Verfasst: Mittwoch 20. Januar 2010, 15:10
von derdon
Ja, ich musste ne Nacht drüber schlafen. Jetzt weiß ich auch, was jbs meinte. Aber dafür hat mein Code wenigstens genug Inspiration gegeben, um zur Lösung beizutragen.