Seite 1 von 1

Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 12:50
von Kirikkayis
Moin,

folgende Knobelaufgabe ...

ich lese eine csv-dateie ein und spreche [2][0] an.
Darin steht folgendes:

#test x y z
#text hehashasd
#hallo beispieltext Umdrehung 600 1/min

Folgenden Code habe ich:

Code: Alles auswählen

import csv
import re

with open('test.csv', 'r') as csvfile:
    datei = csv.reader(csvfile, delimiter=';')
    y=list(datei)[2][0]
    x=re.sub('[^0-9]', '', y)
    print(x)

Ausgabe: 6001

ich will aber nur die 600
jemand ne idee ?

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 13:14
von Sirius3
Warum ersetzt Du dann alles außer Zahlen?
Wie sieht der Text aus, den Du bearbeiten willst? Also welche Regelmäßigkeit gibt es?
Statt alles, was Du nicht brauchst wegzuersetzen solltest Du das, was Du brauchst suchen.

csv.reader sollte man nicht für Dateien benutzen, die keine csv-Dateien sind. Einbuchstabige Variablennamen sind schlecht, weil sie nichts aussagen.

Code: Alles auswählen

with open('test.csv') as lines:
    _ = next(lines) # header 1 ignored
    _ = next(lines) # header 2 ignored
    line = next(lines)
    ...

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 13:17
von __blackjack__
@Kirikkayis: Was ist denn das Kriterium? Oder ist einfach die vorletzte zusammenhängende Ziffernfolge ausreichend? Dann such einfach nach Ziffernfolgen und nimm über einen negativen Index die vorletzte:

Code: Alles auswählen

In [54]: text
Out[54]: '#test x y z\n#text hehashasd\n#hallo beispieltext Umdrehung 600 1/min'

In [55]: re.findall(r'\d+', text)
Out[55]: ['600', '1']

In [56]: re.findall(r'\d+', text)[-2]
Out[56]: '600'
`x` und `y` sind keine guten Namen weil nichtssagend, `datei` ist kein guter Name weil irreführend. Da würde man ein Dateiobjekt erwarten und keinen CSV-Reader. Wenn man nur an einen Wert in der dritten Zeile kommen möchte, ist das komplette einlesen eventuell auch etwas übertrieben.

@Sirius: Ich hatte das schon so verstanden das es eine CSV-Datei ist, denn ich habe die drei Zeilen als Inhalt dieser *einen* Zelle aufgefasst. Wenn das keine CSV-Datei ist, geht das ja nicht.

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 13:30
von Kirikkayis
Okay, vielleicht nochmal ausführlicher.

Ich habe diese .csv-Datei:

Bild

Screenshot;
https://prnt.sc/mc0uac


Hierbei ist die Solldrehzahl (A3) und Radius (A4) Variabel.
Das nächste Problem hat sich so eben gezeigt, der Radius wird mit einem " , " ausgegebene (Siehe Screenshot).

Ich weis leider überhaupt nicht mehr weiter.

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 13:35
von __blackjack__
@Kirikkayis: Also da würde ich ja einfach `split()` auf den Zeichenketten verwenden und gar keine regulären Ausdrücke. Das Komma kann man durch einen Punkt ersetzen bevor man den Wert in eine Gleitkommazahl umwandeln.

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 13:52
von Sirius3
@__blackjack__: um exakt zu sein, es handelt sich um eine csv-Datei mit Kommentarzeilen; der csv.reader kann diese Kommentarzeilen nicht verarbeiten, man muß sie also im vorhinein getrennt lesen. Kommentarzeilen die ein Trennzeichen enthielten, würden sonst aufgespalten werden.
Erst dann kommt die Header-Zeile, die ein Dict-Reader verarbeiten sollte.

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 14:00
von Kirikkayis
Ich bin jetzt in der Lage die Zeile auszuwerten #freu #freu
Wie folgt:

Code: Alles auswählen

with open('test.csv', 'r') as csvfile1:
    datei = csv.reader(csvfile1, delimiter=';')
    y1=list(datei)[3][0]
    y2 = re.findall(r"[-+]?\d*\,\d+", y1)
    print(y)
    
Sogar das Komma Problem hat sich gelöst #freu
So nun bekomme ich das hier raus:
['140,0']
<class 'list'>
(ich habe den typ gleich mit ausgegeben damit es verständlicher wird)
Gibt es jetzt eine Möglichkeit den wert als float zu erhalten?
Freue mich über jede Antwort

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 14:45
von Kirikkayis
Ich habe nun mit

Code: Alles auswählen

 b3 = ''.join(str(f) for f in b2)
meine 600 zu einem Integer umwandeln können mit:

Code: Alles auswählen

b4 = int(b3)
Problem:

mit 140,0 geht das leider NICHT.

Bekomme immer die Meldung das ich einen String nicht zu einem float umwandeln kann,

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 16:39
von ThomasL
Mach aus dem Komma einen Punkt, dann klappt es.

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 20:49
von Kirikkayis
Problem gelöst.
Vielleicht sollte man halt die richtige Variable umwandeln und als float deklarieren #lach
Für die, die es interessiert:

Code: Alles auswählen

with open('test.csv', 'r') as csvfile1:
    datei = csv.reader(csvfile1, delimiter=';')
    a1=list(datei)[3][0]  
    a2 = re.findall(r"[-+]?\d*\.\d+", a1)
    a3 = ''.join(str(f) for f in a2)
    a4 = float(a3)
    print(a4)

Re: Regex letzte Zahl

Verfasst: Freitag 25. Januar 2019, 21:27
von Sirius3
@Kirikkayis: die Kommentarzeilen sind kein CSV. Wie man es richtig macht, habe ich Dir schon gezeigt. Wenn Du Zahlen ohne . hast, sondern mit , wie Du behauptest, funktioniert das nicht. Wenn Du mehr als eine Zahl mit . in einer Zeile hast, funktioniert das nicht. Wenn Du nur die erste Zahl willst, benutze re.search. a1,a2,a3 und a4 sind schlechte Variablennamen.