Simple Search mit special Character

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
Mardor
User
Beiträge: 18
Registriert: Montag 9. Februar 2015, 19:07

Sonntag 12. Februar 2017, 12:23

Hallo,

irgendwie hänge ich seit mehreren Stunden bei einem Problem. Ich finde hier einfach auch über eine Internetsuche keine Lösung obwohl es bestimmt total simple ist.

Code: Alles auswählen

import re

xml = """<current>
        <city id="2875377" name="Mannheim">
                <coord lon="9.07" lat="47.82"></coord>
                <country>DE</country>
                <sun rise="2017-02-11T06:34:56" set="2017-02-11T16:41:38"></sun>
        </city>
        <temperature value="-0.53" min="-2" max="1" unit="metric"></temperature>
        <humidity value="88" unit="%"></humidity>
        <pressure value="1020" unit="hPa"></pressure>
        <wind>
                <speed value="2.1" name="Light breeze"></speed>
                <gusts></gusts>
                <direction value="50" code="NE" name="NorthEast"></direction>
        </wind>
        <clouds value="90" name="overcast clouds"></clouds>
        <visibility value="7000"></visibility>
        <precipitation mode="no"></precipitation>
        <weather number="741" value="fog" icon="50n"></weather>
        <lastupdate value="2017-02-11T18:50:00"></lastupdate>
</current>"""

temperature_output = re.compile(r'temperature value=\"(\d\.\d\d)')
mo = temperature_output.search(xml)
print (mo.group(1))
Ganz simple möchte ich mir die Temperatur und Luftfeuchtigkeit als Wert ausgeben lassen. Mein Problem ist, dass ich es nicht schaffe das Anführungszeichen (") in der re.compile Zeile zu excluden. Natürlich kann ich es durch ein .* ersetzen, aber das wäre IMHO nicht Sinn der Sache. Weiterhin erhalte ich den Wert immer als Pluswert, d.h. -0,53 wird mit immer als 0,53 angezeigt.

Hätte jemand eine Idee ?

LG
Zuletzt geändert von Anonymous am Sonntag 12. Februar 2017, 13:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Sonntag 12. Februar 2017, 13:12

@Mardor: Meine Idee wäre zum verarbeiten von XML keine regulären Ausdrück zu verwenden, denn man kann XML nicht wirklich mit regulären Ausdrücken verarbeiten. Dafür gibt es XML-Parser wie die `ElementTree`-API in der Standardbibliothek oder vom externen Package `lxml.etree`.

Edit:

Code: Alles auswählen

In [8]: from xml.etree import ElementTree as etree

In [9]: root = etree.fromstring(source)

In [10]: root
Out[10]: <Element 'current' at 0x905020c>

In [11]: root.find('temperature')
Out[11]: <Element 'temperature' at 0x91902cc>

In [12]: root.find('temperature').get('value')
Out[12]: '-0.53'
Benutzeravatar
Cronut
User
Beiträge: 34
Registriert: Sonntag 5. Februar 2017, 09:50
Wohnort: HRO, GER

Sonntag 12. Februar 2017, 13:27

Finde den Weg über den XML-Baum auch schöner.

Ansonsten, wenn es mit Regex sein muss. Bei mir funktioniert dein Beispiel, wenn ich noch den optionalen Minuswert angebe:

Code: Alles auswählen

r'temperature value=\"([-]?\d\.\d\d)'
“Clean code always looks like it was written by someone who cares.” (Michael Feathers)
Check out: https://awesome-python.com/
Antworten