2016-08-30 3 views
0

Ich bin auf der Suche nach etwas Text aus einem rohen Kreditkarten-Feed für einen Workflow zu extrahieren. Ich bin fast dahin gekommen, wo ich möchte, aber ich kämpfe mit der letzten Information, die ich zu extrahieren versuche.Extrahieren von Daten mit Regex von Bank-Feed

Ein Beispiel für den Roh-Feed ist:

LEO'SFINEFOOD&WINEHARTWELLJune350.0735.00ICGROUP,INC.MELBOURNEJune5UNITEDSTATESDOLLARAUD50.07includesconversioncommissionofAUD1.469.96WOOLWORTHS3335CHADSTOCHADSTONE 

ich dies aus der oben zu extrahieren suchen:

(ICGROUP,INC.MELBOURNE)June5UNITEDSTATESDOLLARAUD(50.07)includesconversioncommissionof 

mit den Klammern, die die beiden Gruppen I nach bin. Die konsistenten Teile über alle Instanzen hinweg von dem, was ich zu extrahieren bin versucht:

DIGITS (TEXT) DATE TEXT AMOUNT includesconversioncommissionof 

ich in der Lage, die regex zu verwenden:

([A-Z][a-z]\d)[A-Z]AUD(\d\,?\d+?.\d*)includesconversioncommissionofAUD 

mir das Datum und den Betrag zu erhalten. Ich kämpfe, um einen Weg zu finden, wie nach dem Beispiel über die Wörter ICGROUP,INC.MELBOURNE Ich habe versucht, setzen \d\d(.*) vor dem oben genannten Regex, aber das funktioniert aus irgendeinem Grund nicht.

Würde mich freuen, wenn jemand in der Lage ist, mit dem zu helfen, wonach ich suche!

+1

Was ist dieses schreckliche Format? Wie können Sie im Teil "WELLJune350.07" wissen, wo das Datum endet und wo der Betrag beginnt?Okay, es gibt keinen 35. Juni, aber was wäre, wenn es "Juni250.07" wäre? Sind das am 2. Juni 50 Dollar oder am 25. Juni 0.07 Dollar? –

+0

Das ist ziemlich hart und dehnt definitiv die Grenzen dessen aus, was vernünftig getan werden kann. Sind Sie sicher, dass sie Ihnen die Daten nicht mit einigen Begrenzern senden können? Ist der Wert in der Position nach 'ICGROUP, INC.MELBOURNE' immer der vollständige Name des Monats gefolgt von einem numerischen Tag? – mwp

+0

Hey! Ich war schon öfters bei "LEO'SFINEFOOD & WEINHARTWELL" :) – Bohemian

Antwort

1

Der nächstgelegene ich denke, wir können (PCRE) bekommen, ist so etwas wie:

/ 
    [\d,.]+      # a currency value to bookend 
    (.+?)       # capture everything in-between 
    [A-Z][a-z]+\d+     # a month followed by a day, e.g. "June5" 
    .+?       # everything in-between 
    ([\d,.]+)      # capture a currency value 
    includesconversioncommissionof # our magic token to bookend 
/x 

Die Technik hier ist gierig Ausdrücke gegen nicht-gierige Ausdrücke in einer sehr bewussten Art und Weise an die Box. Lass es mich wissen, wenn du Fragen dazu hast. Ich würde sehr zögerlich sein, dies in die Produktion zu bringen - oder sogar seiner Produktion als Ad-hoc-Pass zu vertrauen - ohne strenge Tests!

Ich verwende das Muster [\d,.] für Währung, aber Sie können das durch etwas anspruchsvolleres ersetzen, vor allem, wenn Sie seltsame Formate und Währungssymbole erwarten. Der größte potenzielle Nachteil ist hier, wenn der Token ICGROUP,INC.MELBOURNE mit einer Nummer beginnt. Dann brauchen Sie definitiv ein ausgeklügelteres Währungsmuster!

0

Hier ist, was ich habe (in php).

$string = "LEO'SFINEFOOD&WINEHARTWELLJune350.0735.00ICGROUP,INC.MELBOURNEJune5UNITEDSTATESDOLLARAUD50.07includesconversioncommissionofAUD1.469.96WOOLWORTHS3335CHADSTOCHADSTONE"; 

$cleaned = preg_replace("/^(LEO'SFINEFOOD&WINEHARTWELL)([A-Za-z]{3,9})(\.|\d)*/", "", $string); 
echo $cleaned; 

, was es gibt ist: ICGROUP, INC.MELBOURNEJune5UNITEDSTATESDOLLARAUD50.07includesconversioncommissionofAUD1.469.96WOOLWORTHS3335CHADSTOCHADSTONE

die Sie dann Ihre eigene kleine regex verwenden und laufen.

Erläuterung:

Die \w{3,9} verwendet wird, um den Monat zu entfernen, die 3-9 Zeichen lang sein kann. Dann die (\.|\d)* ist die Ziffern und Punkte zu entfernen. Ich denke, dass wir den Monat/das Datum besser analysieren könnten, indem Sie Ihre Regex verwenden, um diesen Teil des 5. Juni zu extrahieren, aber aus Ihrem Beispiel heraus, sollte es nicht notwendig sein.

Es wäre jedoch viel hilfreicher, wenn Sie mindestens 3 Beispiele bereitstellen könnten, optimal 5, damit wir ein gutes Gefühl für das Muster bekommen. Ansonsten ist dies das Beste, was ich mit dem, was Sie gegeben haben, machen kann.

+1

@ a-lau Wenn Sie eine Zeichenklasse in einer Regex mit '[]' definieren, entspricht sie per Definition einem beliebigen Zeichen in dieser Klasse. Der Pipe Operator in deiner Charakterklasse ist daher nicht notwendig; in der Tat ist es falsch, weil es ein Pipe-Zeichen in der Eingabezeichenfolge übereinstimmt! Sie müssen das periodische Zeichen innerhalb einer Zeichenklasse auch nicht verlassen; PCRE versteht aus dem Kontext, dass Sie eine wörtliche Periode meinen. – mwp

+0

@mwp mein Fehler, sollte eine runde Klammer sein. Wird sich verändern. –

+0

Danke dafür. Hat es geschafft, dank der Antworten zu funktionieren! –