2016-04-27 15 views
1

Im eine Reihe von Zahlen zu analysieren versuchen, die wie dies Mirregex für das Parsen von komplexer Reihe von Zahlen

38,97 -99,63 $ 0.6512.00 1 0 185,00 0 -126,00 1,750 4,87

sehen möchte alle Zahlen mit einer Genauigkeit von 2 Ziffern nach dem Punkt extrahieren. Ich möchte auch die Nummer mit dem fehlenden Raum extrahieren "0.6512.00"

ich komme mit diesem

(- (?:?. \ D + (: \ d {0,2 })?))

aber das Problem ist, dass es 1,750 bis 1,75 und 0

spaltet

hat jemand eine Idee hat, wie diese zu lösen? Dank

+0

könnten Sie setzen '\ d *' außerhalb der Klammern die zusätzlichen Stellen im Spiel enthalten, aber nicht die Aufnahme.Ich würde vorschlagen, mit z.B. https://regex101.com/#python – jonrsharpe

+0

Und wie '0.6512.00' sollte aufgeteilt werden? '0.651' (Entfernen der 1) und' 2.00' oder '0.65' und' 12.00'? – Francesco

+0

können Sie nicht einfach den Text mit '.split()' teilen und jedes Wort getrennt verarbeiten? – svs

Antwort

0

Sie

this regex demo

Der Hauptpunkt ist, unter Verwendung von 2 Alternativen

(-?\b(?:\d+\.\d{0,2}(?!0*[1-9])|(?<!\d\.)\d+(?!\.\d)))0*\b 

Siehe verwenden können, ein für Float-Werte - \b(?:\d+(?:\.\d{0,2})(?!0*[1-9]) - mit 2 Stellen im Dezimalsystem Teil und die andere - (?<!\d\.)\d+(?!\.\d) - für übereinstimmende ganzzahlige Werte. Die nachgestellte 0* wird für Floats übereinstimmen, aber nicht erfasst werden. Verwenden Sie den Wert der Gruppe 1.

+0

Dies extrahiert weder die Nummer mit dem fehlenden Platz noch verwaltet die '1.750', die nicht einmal – Francesco

+0

@Francesco: Haben Sie sich die [Demo] (https://regex101.com/r/aJ7hJ4/1) '1.750' sollte nicht übereinstimmen, da es 3 Ziffern im Dezimalteil hat, und es passt' 0.6512.00' –

+0

Ich vermute, dass dies nicht das ist, was er fragte, aber ich überlasse es @manuel – Francesco

0

versuchen dieses regex

\d+\b\.\b(?:(?!\.|)[0-9]){2} 

der Ausgang enter image description here

0

Hier wird meine zwei Cent wert sind:

[-+]?\d+(?:(?:\.\d+)(?![.\d])|(?:\.\d{1,2}))? 

Es ermöglicht ein optionales Zeichen, gefolgt von einer Reihe von Ziffern, dann wahlweise gefolgt von -

ein Punkt (.) und eine Reihe von Ziffern, nicht mit einem Punkt beendet, oder ...

ein Punkt und 1 oder 2 Dezimalstellen.

Es erfüllt alle Kriterien, mit dem Zusatz (Ausnahme?) Der 3 + Dezimalzahlen Rundung, dh es bleibt, dass, da der Anzahl Parser 1.750 zu 1.75 gerundet werden sollte, und 1.758 sollte rund um 1.76, und es gibt keine Way Regex wird das richtig machen;).

Se it work here at regex101.

Grüße

bearbeiten leichte Vereinfachung der Regex und Beschreibung

Verwandte Themen