Regular Expression

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
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Hallo,

meine Inputdatei sieht wie folgt aus:
00922167 Anja 31.08.2008 /553 akt 0,00
0,00 0,00
Aufrolld. zur letzten Abr +/- 0,00
0,00 1.396,81
00809181 Renate 31.08.2008 /553 akt 0,00
0,00 0,00
Aufrolld. zur letzten Abr +/- 0,00
0,00 11.743,74
00658055 Maria 31.08.2008 /553 akt 0,00
0,00 0,00
Aufrolld. zur letzten Abr +/- 0,00
0,00 4,16
00893353 Monika 31.08.2008 /553 akt 0,00
0,00 0,00
Aufrolld. zur letzten Abr +/- 0,00
0,00 405,83
Laut dem Programm Kodos, sollte ich mit folgender regular Expression .*(?P<Rate>\d*.\d+,\d+).*(?P<AmtP>\d*.\d+,\d+) all jene Werte bekommen, die oben fett markiert sind.
Jedoch wenn ich mein Python Programm laufen lasse, dann schneidet er nach 2 Stellen ab. z.B. Statt 405,83 gibt es nur 05,83 aus.

Wo liegt der Fehler in der regular Expression??
BlackJack

Der Fehler liegt daran, dass die Wiederholungen "greedy" sind, also so viel wie möglich zu "matchen" versuchen.

Mal am Beispiel: '0,00 405,83' und '.*(?P<Rate>\d*.\d+,\d+).*(?P<AmtP>\d*.\d+,\d+)' von hinten gelesen:

Mindestens eine Ziffer mit einem ',' davor: ',83'
Davor mindestens eine Ziffer: '5,83'
Davor ein beliebiges Zeichen: '05,83'
Davor 0 oder mehr Ziffern -- die gibt's aber nicht mehr weil die '4' schon von dem '.*' vor der Gruppe `AmtP` gematcht wurde.

Punkte haben in regulären Ausdrücken eine besondere Bedeutung, wenn Du also wirklich einen *Punkt* matchen willst, musst Du den mit einem Backslash schützen.

Genau das gleiche Ergebnis erhalte ich übrigens auch in Kodos!

Die Frage ist, ob man überhaupt reguläre Ausdrücke braucht.

Code: Alles auswählen

from __future__ import division, with_statement
from itertools import izip


def main():
    with open('test.txt') as lines:
        for line_a, line_b, line_c, line_d in izip(lines, lines, lines, lines):
            dummy, name, dummy = line_a.split(None, 2)
            dummy, number_a = line_b.split()
            dummy, number_b = line_d.split()
            print name, number_a, number_b
Ausgabe:

Code: Alles auswählen

Anja 0,00 1.396,81
Renate 0,00 11.743,74
Maria 0,00 4,16
Monika 0,00 405,83
Madpuella
User
Beiträge: 11
Registriert: Freitag 28. November 2008, 22:05
Wohnort: Bochum
Kontaktdaten:

Hallo,
ich habe mal wieder ein neues Problem, bei dem ich nicht weiterkomme. Diesmal handelt es sich um reguläre Ausdrücke. Undzwar lautet die Aufgabe wie folgt:
Eruieren Sie die Gesamthäufigkeit des Auftretens der folgend beschriebenen Muster (in einem mir vorliegenden Text, aber dieser ist an dieser Stelle ja erstmal unwichtig):
1. Suffix eines Wortes, beginnend mit "ge", gefolgt von "n","r" oder"s" (also: "gen" oder "ger" oder "ges")
2.zweimal direkt aufeinanderfolgende Artikel "der", "die" oder "das"
3.Auftreten des Infixes "der", dem kein Vokal vorangeht
4. Auftreten eines Zeichens zwischen zwei alphanumerischen Zeichen, das weder alphanumerisch noch whitespace ist.

Bisher habe ich nur die Lösung für Aufgabe 1 rausbekommen: re.findall(r"\bge*n|\bge*r|\bge*s",s)
Und die anderen Aufgaben sollten ja eigentlich ebenso machbar sein, aber irgendwie krieg ich das nicht hin. Bei Aufgabe 3 z.B. weiß ich nicht, wie ich markiere, dass es kein Vokal sein soll, denn ich weiß nur, wie ich markiere, dass es ein Vokal ist, doch ist dies ja leider eben nicht gefragt. Bei Aufgabe 2 weiß ich absolut nicht, wie ich da ansetzten soll, und bei Aufgabe 4 bin ich auch überfordert, denn wenn ich z.B. re.findall(r"\w\W\S.\w",s) eingebe, findet er mir leider immer nur Ausschnitte, bei denen das Zeichen ein Blank ist, und genau das soll es ja nicht sein :-( Vielleicht erbarmt sich ja jemand von euch und kann mir weiterhelfen... Wäre sehr dankbar für jeden Tipp...
Lieben Gruß
Madpuella
User
Beiträge: 11
Registriert: Freitag 28. November 2008, 22:05
Wohnort: Bochum
Kontaktdaten:

Achja, vermutlich muss man einfach denken, und nicht zu kompliziert. Aber ich weiß absolut nicht weiter. Aber wie schon gesagt: Vielleicht weiß ja jemand von euch Rat...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Man sollte sich einfach mal die Doku und die Howtos angucken! Dort stehen doch Methoden drin für Probleme a la "Diese Zeichen dürfen nicht vorkommen"!

Ich kapiere auch nicht, wie man 1 schaffen kann, 2 aber nicht? Das ist doch dasselbe in grün ...

Und bei 4. geht es doch auch wieder um so eine Art "Verneinungs"-Konstrukt!

Also ich finde, Du müßtest da schon noch zuerst eigene Ansätze präsentieren, bevor wir hier konkreter helfen! Denn Hausaufgaben sollen ja etwas vermitteln ;-)
BlackJack

@Hyperion: Lösung für 1 ist keine korrekte Lösung für 1. Und Die drei Alternativen *so* zu schreiben, ist sicher auch nicht die Musterlösung.

Da das Hausaufgaben sind, denke ich auch, Madpuella sollte sich selber mal mit der Doku zum `re`-Modul und dem HowTo beschäftigen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Hyperion: Lösung für 1 ist keine korrekte Lösung für 1. Und Die drei Alternativen *so* zu schreiben, ist sicher auch nicht die Musterlösung.
Das kann gut sein - ich habe mir das nicht so genau angesehen und auf die Korrektheit vertraut ;-)
Antworten