Regex Hilfe

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
Batsche
User
Beiträge: 3
Registriert: Dienstag 1. Oktober 2019, 09:43

Hi zusammen,

für ein Projekt muss ich in Python mit diversen Regexen arbeiten um Strings zu matchen und sie anders auszugeben.

Konkret geht es mir darum, dass ich viele Zahlen von 0 - 9999.99 habe. Diese möchte ich gruppiert ausgeben in der Art, wenn Zahl 0-249.99 dann replace mit < 250. Wenn Zahl 250 - 499.99 dann replace mit 250 - 499.99 als Beispiel.

meine Werte sind von ganzen Zahlen über Dezimalzahlen. Beispiel:

0.99
4
345
588.41

etc.

Ich bin leider kein Webex Profi und mit den normalen Mitteln komme ich mit regex101.com leider nicht weiter. Ich habe das Problem erstmal in der Regex die Range einzuschränken und zweitens mit den Dezimalzahlen.

Habt ihr vielleicht für mich die passende Codezeile? Würde mir enorm weiterhelfen!

Danke und viele Grüße
Batsche
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Warum Reguläre Ausdrücke?
Wenn die Zahlen, wie in deinem Beispiel, einzeln je Zeile stehen, dann ist es einfacher jede Zeile kurz zu parsen.
Zeig doch mal anhand eines Beispiels, wie die Eingangsdaten tatsächlich aussehen und wie sie hinterher aussehen sollen. Denn "Wenn Zahl 250 - 499.99 dann replace mit 250 - 499.99 als Beispiel" macht ja recht wenig Sinn.

Oder noch besser: Zeig uns Eingangsdaten und erkläre, was hinterher überhaupt rauskommen soll. Wenn es nämlich darum geht, Werte zu gruppieren und nur den Endwert zu haben, dann muss man auch nicht "replacen".
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Um alle Integer und alle Floats anzeigen zu lassen in einem Text:

Code: Alles auswählen

import re

text = "Wenn 0.99 die Zahlen 66 irgendwo 568.7 in einem String 1234 vorkommen, dann ist RegEx gut"
numbers = re.findall(r'(\d+(?:\.\d+)?)', text)
print(numbers)
Allerdings verstehe ich den Rest deiner Aufgabe nicht.
Batsche
User
Beiträge: 3
Registriert: Dienstag 1. Oktober 2019, 09:43

Ok ich erkläre die Aufgabe mal.

Ich habe folgende Werte:

16
8
4
32
64
1000
500
128
2000
8.19
0.5

usw. Die Liste umfasst momentan 185 Werte, diese Werte sind aber nicht fix, können ständig variieren und diese werden alle in einzelnen Zeilen ausgegeben. Leider bin ich überhaupt kein Regex Experte, muss aber dafür sorgen dass diese Werte sauber im Frontend ausgegeben werden. Dazu habe ich den regex_replace der ungefähr so aussieht:

{
"extractor_type": "regex_replace",
"properties": {
"pattern": "xxxxx",
"replace_by": "< 125.00"
}

{
"extractor_type": "regex_replace",
"properties": {
"pattern": "xxxxx",
"replace_by": 125 - 299"
}

etc

in pattern kommt eben meine Regex rein z.B. [0-9]{1,4}\\.\\d+ oder irgendwie so - ich habe die funktionierende Regex eben noch nicht herausgefunden, was ich jetzt als Beispiel hier geschrieben habe soll nur verdeutlichen was ich suche.

Nun möchte ich eine gebündelte Darstellung im Frontend erreichen, deswegen war meine Vorstellung eben "< 125", "125-299", 300-499" "500 - 749" "750-999" "> 1000" so ungefähr.

Ich hoffe es ist nun etwas klarer was ich erreichen will und das ihr mir helfen könnt.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Den benötigten Ausdruck habe ich oben gepostet. Wann du welche Zahl unter welchen Vorraussetzungen ersetzen willst habe ich noch nicht ganz verstanden. Also bei allen Werten unter 125 soll er "< 125" und bei allen über 1000 "> 1000" schreiben? Oder möchtest du die Zahlen einem Bereich zuordnen?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist denn das für ein Framework? Woher kommt dieses JSON-Format? Warum müssen es reguläre Ausdrücke sein? Wer parst das? Zeilenweise, oder als ein Textblock?
Es ist ziemlich schwierig, beliebige Zahlen, zudem noch Kommazahlen, per regulärem Ausdruck nach der Größe zu vergleichen. Einfacher ist es, die Zeilen in Zahlen zu verwandeln.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@Batsche: Irgendwie erzählst du uns nur die halbe Geschichte. Mit Regulären Ausdrücken sucht man Muster in einer Zeichenkette. Du hast aber Werte je Zeile. Durchlauf sie und parse jede einzelne Zeile. Ein Regex ist hier absolut unnötig. Das schrieb ich aber schon ganz weit oben.
Batsche
User
Beiträge: 3
Registriert: Dienstag 1. Oktober 2019, 09:43

Hey zusammen,

ich erzähle nicht mit Absicht evtl. nur die halbe Geschichte sondern weil ich es nicht besser weiß. Ich bin kein Coder, wir müssen aber aktuell in dem Projekt die ausgegebenen Werte noch selbst schreiben, bis eine UI entwickelt wurde. Wir haben nur eine begrenzte Anzahl von Werten die wir in Pycharm verwenden können damit diese "Scripte" ausgeführt werden können.

Zum matchen haben wir dazu regex_extract und regex_replace neben extract_by_listmap oder map_replace wo ich aber keine Platzhalter bzw. Codes a la Regex verwenden kann. Bei der Listmap müsste ich jeden Wert einzeln nennen damit er erkannt und zugeordnet wird, weshalb ich dachte, dass es mit einer regex einfach geht.

Ich kann auch nichts parsen oder umwandeln, ich kann in der JSON nur die begrenzten vordefinierten Extractoren verwenden

@Jankie Ja alle Werte unter 124.99 sollen < 125 zugeordnet werden, dann mache ich eine neue Regex nach dem selben Muster nur mit einer anderen Zahlenrange also dann entsprechend von 125 - von mir aus 249.99 usw. Mit deinem Ausdruck re.findall(r'(\d+(?:\.\d+)?)', text) kann ich nicht arbeiten, es darf wirklich nur ein reiner Regex Code sein. Wir testen wie gesagt auch mit regex101.com, da wird auch der Code ohne re.findall am Anfang nicht erkannt.

(\d+(?:\.\d+)?) wird zwar erkannt, bringt mir aber nichts, da ich ja hier keine Bereiche einschränken kann, also von 0.00 - 124.99 sondern es wird einfach jede Zahl gematched was mir dann wieder nichts bringt.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit solchen Einschränkungen ist das Problem halt schwierig bis umständlich zu lösen, da ist die Frage doch berechtigt, warum es diese Einschränkungen gibt.
Also entweder ist das Projekt falsch gestellt, es wurden falsche Schnittstellen definiert, oder Du sollst die Aufgabe ganz anders lösen. Mit der uns zur Verfügung stehenden Information, kann man nur sagen, da paßt was nicht. Daher ja meine Fragen, was für ein Framework das ist, das dieses JSON verarbeitet und was das große Ziel sein soll.
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Reguläre Ausdrücke sollten hier nur verwendet werden, um die Zahl herauszufischen (falls nötig). Das ist dann aber im Sinne von "Text mit Ziffern (und Dezimaltrennzeichen)" gemeint. Der Wert, der durch diesen "Zahl-Text" repräsentiert wird, ist keine Regex-Sache mehr, da reguläre Ausdrücke nur auf der Text-Ebene operieren. Das Erkennen einzelner Ziffern ist möglich (z.B. alle Ziffern zwischen 0-5), aber nicht die Interpretation von aneinandergereihten Ziffern im Sinne einer Zahl (also nicht: 0-500). Zumindest nicht wenn der reguläre Ausdruck für einen Menschen noch halbwegs lesbar sein soll.

Da würde man eher den Text umwandeln in einen Zahl-Typ via int() bzw float() und könnte es dann genauer einordnen. Schau mal besser ob dein Framework etwas in dieser Richtung unterstützt, denn nur mit dem Regex-Ansatz wirst du hier nicht wirklich weiterkommen...
Antworten