Regex letzte Zahl

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
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

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 ?
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
    ...
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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.
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

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
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

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,
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Mach aus dem Komma einen Punkt, dann klappt es.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

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)
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten