re multiple matches

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

If a group matches multiple times, only the last match is accessible:
Nun möchte ich aber alle groups haben, geht das?

Also konkret:

Code: Alles auswählen

Einkaufsliste
3x a
2x b
4x c
Summe: 30
Am Ende möchte etwas wie `[('3','a',), ('2','b'),('4','c')]` und die Summe
herausbekommen. Mein re findet allerdings nur `4 c`.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Nun kann es aber vorkommen, dass vor `Einkaufsliste` und nach `Summe` weitere Sachen wie `3x a` vorkommen können.

Code: Alles auswählen

2x f
Einkaufsliste
3x a
2x b
4x c
Summe: 30
7x f
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Dann kannst du 2 verwenden, eine regex für Einkaufsliste...Summe, dann mit einer 2. so wies derdon vorgeschlagen hat
the more they change the more they stay the same
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Die davor und danach sollen nicht mitgezählt werden. Hätte mal mein Problem genauer beschreiben sollen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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/ :oops:
Edit2: re.compile kann ich natürlich auch weglassen -> http://paste.pocoo.org/compare/167302/167296/
Zuletzt geändert von derdon am Dienstag 19. Januar 2010, 23:06, insgesamt 2-mal geändert.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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 :).
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ganz einfach: Weil ich davon ausgegangen bin, dass du mit Dateien arbeitest. :wink:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

derdon hat geschrieben:Ganz einfach: Weil ich davon ausgegangen bin, dass du mit Dateien arbeitest. :wink:
Dann sollte man vorher die Datei einlesen und die Daten als Funktionsparameter weitergeben ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@derdon: Danke für deinen Code!
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Antworten