Python Regulärer Ausdruck (Regex) stimmt mit Komma getrennter Zahl überein - warum funktioniert das nicht?

8

Ich versuche Transaktionsbriefe von meiner (deutschen) Bank zu analysieren. Ich möchte alle Zahlen aus der folgenden Zeichenfolge extrahieren, die sich als schwieriger herausstellt, als ich dachte. Option 2 macht fast das, was ich will. Ich möchte es jetzt ändern, um z. 80 auch.

Mein erster Versuch ist Option 1, die nur Müll zurückgibt. Warum gibt es so viele leere Saiten zurück? Es sollte immer mindestens eine Nummer von der ersten \ d +, nein?

haben

Option 3 funktioniert (oder funktioniert zumindest wie erwartet), also beantworte ich irgendwie meine eigene Frage. Ich denke, ich mache mir hauptsächlich Sorgen darüber, warum Option 2 nicht funktioniert.

%Vor%

Ausgabe ist

%Vor%     
Matthias Kauer 01.05.2013, 15:20
quelle

6 Antworten

8

Option 1 ist die am besten geeignete Regex, aber sie funktioniert nicht richtig, weil findall das zurückgibt, was mit der Erfassungsgruppe () übereinstimmt, nicht die vollständige Übereinstimmung.

Zum Beispiel sind die ersten drei Übereinstimmungen in Ihrem Beispiel die 18 , 04 und 2013 , und in jedem Fall wird die Erfassungsgruppe nicht angepasst, so dass eine leere Zeichenfolge zur Ergebnisliste hinzugefügt wird.

Die Lösung besteht darin, die Gruppe nicht erfassen

%Vor%

Option 2 funktioniert nur so lange nicht, bis Sequenzen, die kein Komma enthalten, nicht übereinstimmen.

Option 3 ist nicht großartig, weil es z.B. +,1 .

    
MikeM 01.05.2013, 15:33
quelle
3
  

Ich möchte alle Zahlen aus der folgenden Zeichenfolge extrahieren ...

Mit "Zahlen", wenn Sie sowohl die Währungsbeträge als auch die Daten meinen, denke ich, dass dies tun wird, was Sie wollen:

%Vor%

Ausgabe:

%Vor%

Wenn Sie unter "Zahlen" nur die Währungsbeträge verstehen, verwenden Sie

%Vor%

Oder vielleicht noch besser,

%Vor%     
Dave 01.05.2013 15:35
quelle
1

Diese Frage ist relevant; das folgende

%Vor%

Ausgaben

%Vor%

Das Ausschließen der "punktierten" Zahlen ist etwas komplizierter:

%Vor%

Dies gibt

aus %Vor%     
Andrew Cheong 01.05.2013 15:29
quelle
1

Hier ist eine Lösung, die die Anweisung analysiert und das Ergebnis in ein Dictionary namens bank_statement :

schreibt %Vor%

Die Ausgabe dieses Codes:

%Vor%

Diskussion

  • Der Code durchsucht die Anweisungszeichenfolge Zeile für Zeile
  • Es bricht dann jede Zeile in Token
  • Durch die Token scannen und nach dem Doppelpunkt suchen. Wenn gefunden, verwenden Sie den Teil vor dem Doppelpunkt als Kategorie und den Teil danach als Wert. bank_statement['Extag'] zum Beispiel hat den Wert von '18 .04.2013 '
  • Bitte beachten Sie, dass alle Werte Zeichenfolgen sind, nicht Zahlen, aber es ist trivial, sie zu konvertieren.
Hai Vu 01.05.2013 16:07
quelle
0

Versuchen Sie Folgendes:

%Vor%

Diese Regex erfordert, dass die Übereinstimmung mindestens mit einer Zahl beginnt, dann mit einer beliebigen Menge einer Mischung aus Zahlen, Kommata und Punkten, und dann sollte sie auch mit einer Zahl enden.

    
rednaw 01.05.2013 15:37
quelle
0

Option 2 stimmt nicht mit Zahlen wie '18 .04.2013 'überein, weil Sie' \ d +, \ d + 'zusammenpassen, was

bedeutet

Ziffer (ein oder mehrere) Komma Ziffer (eine oder mehrere)

Zum Analysieren von Ziffern in Ihrem Fall verwende ich

%Vor%

was in

übersetzt wird %Vor%     
nacholibre 01.05.2013 15:37
quelle

Tags und Links