Zahlen aus String auslesen

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
morph
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2006, 13:05

Donnerstag 15. März 2007, 11:18

Hallo,

ich habe hier einen seriellen Temperatur- und Luftfeuchtigkeitssensor, den ich gerne auslesen möchte. Das funktioniert soweit mit pyserial auch gut, allerdings erhalte ich dann einen string, der etwa folgendermaßen aussieht: "temperature=24.0°C humidity=46%"

Nun möchte ich die Zahlenwerte aber Variablen zuweisen, um diese weiterverarbeiten zu können, so dass nachher die Variable temp den Wert 24.0 und die Variable hum den Wert 46 bekommt.

Leider stehe ich da jetzt auf dem Schlauch. Ich habe zwar schon überlegt, den String zeichenweise auszulesen und das Ergebnis, wenn es sich um eine Zahl oder einen Punkt handelt in einen weitern String zu schreiben und diesen dann nach float zu konvertieren, aber das ganze kommt mir doch sehr umständlich vor. Hat jemand einen Tip, wie ich das ganze eleganter und mit weniger Aufwand hinbekommen kann?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 15. März 2007, 11:28

Hoi,

wenn es wirklich keine einfachere Weise gibt (nämlich die Werte direkt zu erhalten), dann kannst Du es so probieren:

Code: Alles auswählen

>>> s = "temperature=24.0°C humidity=46%"
>>> temp, hum = float(s[12:16]), int(s[29:31])
>>> temp
24.0
>>> hum
46
Das wäre einze Zeile relevanter Code. Ärgerlich wäre es, wenn sich die Positionen der Zahlen verändern würden oder auch noch andere Strings übergeben würden. In dem Fall würde ich zu einem "Eigenbauminiparser" auf der Basis von regulären Audrücken (re-modul) empfehlen. Ist vielleicht ein overkill, aber u. U. besser als viele Ausnahmen gesondert zu behandeln.

Gruß,
Christian
Benutzeravatar
Käptn Haddock
User
Beiträge: 167
Registriert: Freitag 24. März 2006, 14:27

Donnerstag 15. März 2007, 11:29

Du kannst mit Regular Expressions den String nach den Zahlen durchsuchen und die resultierenden Teilstrings dann in Zahlen umwandeln.

Gruß Uwe
---------------------------------
have a lot of fun!
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Donnerstag 15. März 2007, 11:31

genügt da folgende RegEx nicht?

Code: Alles auswählen

'temperature=(\d+.\d)°C humidity=(\d+)%'
Gruß P.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 15. März 2007, 12:41

Eigentlich schon, fand es nur einen Overkill und meinte regexes sind nur interessant, wenn sich das Schema des Strings ab und an ändert. (Code gewinnt ja oft nicht gerade an Lesbarkeit, wenn regexes darin rumschwirren ;-).)

Ansonsten, der Vollständigkeit halber:

Code: Alles auswählen

>>> import re
>>> x = re.compile('temperature=(\d+.\d)°C humidity=(\d+)%')
>>> match = re.match(x,s)
>>> temp, hum = float(match.groups()[0]), int(match.groups()[1])
>>> print temp, hum
24.0 46
Nur ist das eben keine Vereinfachung zum ersten Beispiel, im Gegenteil. Ggf. muß der Ausdruck halt angepasst werden, weniger explizit, je nachdem, wie der Datenfluß so aussieht.

Gruß,
Christian

edit: ups, match.group(1) und (2) ginge natürlich auch.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 15. März 2007, 13:03

Wenn die Reihenfolge immer gleich ist, kann man ja auch das machen:

Code: Alles auswählen

In [1]: s = "temperature=24.0°C humidity=46%"

In [2]: pattern = re.compile("\d+(?:\.\d+)?")

In [3]: pattern.findall(s)
Out[3]: ['24.0', '46']
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Donnerstag 15. März 2007, 14:38

CM hat geschrieben:Eigentlich schon, fand es nur einen Overkill und meinte regexes sind nur interessant, wenn sich das Schema des Strings ab und an ändert. (Code gewinnt ja oft nicht gerade an Lesbarkeit, wenn regexes darin rumschwirren ;-).)
...
Unsere Posts liegen wenige Minuten auseinander.
Heißt: Mein Vorschlag ist unabhängig von Deinem.

Dein Vorschlag sollte aber bei einstelligen Werten auf die Nase fallen.

Edit:

Code: Alles auswählen

cre = re.compile(r'temperature=(?P<TEMP>\d+.\d).C humidity=(?P<LF>\d+)%')
m = cre.search('temperature=24.0°C humidity=46%')
temp, luftf = m.group('TEMP'),  m.group('LF')
Antworten