FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: curt am 08 März 2019, 04:42:17

Titel: RegEx - über mehrere Zeilen
Beitrag von: curt am 08 März 2019, 04:42:17
Ich würde mir gern mehrere Waldbrandwarnstufen darstellen. Das ist nicht so einfach wie Hochwasser, da Waldbrand Ländersache ist. Für mein Bundesland habe ich eine html-Seite gefunden: http://waldbrandapp.landeszentrumwald.sachsen-anhalt.de/rest/index.php/public/dangerInfoTable

Beispielsweise will ich Elsterland, da regelt also
Wittenberg - Elsterland.*([0-9])

Ich bin ziemlich stolz, auf meinem Zeugnis wird also stehen "wenn er motiviert wird, bemüht er sich". Zu einer günstigeren Beurteilung kommt es aber nicht, da die RegEx ja auf den Quelltext Anwendung findet:


          <tr>

            <td>Wittenberg - Elsterland</td>
            <td>01.03.2019</td>
            <td>1</td>

          </tr>


Es geht um die eingeschlossene (derzeitige) "1" - die hätte ich gern. Aber: Wir macht man das denn?
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: DeeSPe am 08 März 2019, 09:57:27
Ich nehme an es geht um HTTPMOD?

Dieser Regex könnte funktionieren:
<td>Wittenberg.-.Elsterland</td>\n\s*?<td>\d\d\.\d\d\.\d{4}</td>\n\s+?<td>(\d)</td>

Gruß
Dan
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: Christoph Morrison am 08 März 2019, 13:18:46
Zitat von: curt am 08 März 2019, 04:42:17
Es geht um die eingeschlossene (derzeitige) "1" - die hätte ich gern. Aber: Wir macht man das denn?

Steht die 1 immer an der gleichen Stelle im Dokument? Wenn ja würde ich einen XPath-Ausdruck und keine RegEx nehmen.
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 08 März 2019, 14:11:49
Nein. Es steht dort immer eine Ziffer 0..5.
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 08 März 2019, 21:40:34
Zitat von: DeeSPe am 08 März 2019, 09:57:27
Ich nehme an es geht um HTTPMOD?

Dieser Regex könnte funktionieren:
<td>Wittenberg.-.Elsterland</td>\n\s*?<td>\d\d\.\d\d\.\d{4}</td>\n\s+?<td>(\d)</td>

Ja, HTTPMOD. Dein Vorschlag funktioniert wunderschön, ich danke Dir. (Ich hole mir in einem Devive "Waldbrand" nun für drei Gebiete drei Readings, das kann ich.)

Darf ich denn bitte die Gunst der Stunde schamlos ausnutzen?

Auszug aus https://www.energieverbraucher.de/de/preisabfrage__1101/

<tr>
<td><a name="ost"></a><strong>Ost</strong></td>
<td>01, 02, 03, 04, 06, 07, 08, 09</td>
<td>52</td>
<td>43,5</td>
<td>50</td>
<td>42</td>
</tr>
<tr>
<td><a name="sued1"></a><strong>S&uuml;d I</strong></td>


Es geht notfalls um den Wert, der im Moment auf "42" steht, also den Gaspreis netto ab 3.000 Liter. Viel schöner wäre natürlich, wenn man in einem Rutsch gleich alle vier Werte (derzeit 52, 43.5, 50, 42) in Readings bekommen könnte. Ich hatte vor einiger Zeit mich versucht - es endete im Frust.

Wärst Du bitte so freundlich mir zu helfen?
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: amenomade am 08 März 2019, 21:56:37
(?s)name="ost".*?<td>.*?<td>([\d,]+).*?<td>([\d,]+).*?<td>([\d,]+).*?<td>([\d,]+)
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 08 März 2019, 23:18:11
Wow. Als jemand, der mit RegEx A durch B ersetzen oder C löschen kann, bin ich jetzt völlig von den Socken: Da steht ja preis-1, preis-2, preis-3, preis-4. Ich kann leider nicht so schön zaubern - sehr herzlichen Dank!

Also falls ich das könnte sowie dürfte, würde ich @DeeSPe und @amenomade jeweils meinen goldenen Papporden "freundlicher Helfer des Tages" verleihen - danke!
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: amenomade am 08 März 2019, 23:54:29
Du kannst sogar preis-1 preis-2 preis-3 preis-4 umbenennen:

Entweder mit
attr <name> reading01-1Name Preis_bis_3000_inkl_MwSt
attr <name> reading01-2Name Preis_bis_3000_Netto
attr <name> reading01-3Name Preis_über_3000_inkl_MwSt
attr <name> reading01-4Name Preis_über_3000_Netto
attr <name> reading01Regex (?s)name="ost".*?<td>.*?<td>([\d,]+).*?<td>([\d,]+).*?<td>([\d,]+).*?<td>([\d,]+)


Oder direkt ohne Name attr, nur als Regex:
(?s)name="ost".*?<td>.*?<td>(?<PreisBis3000inklMwSt>[\d,]+).*?<td>(?<PreisBis3000Netto>[\d,]+).*?<td>(?<PreisUeber3000inklMwSt>[\d,]+).*?<td>(?<PreisUeber3000Netto>[\d,]+)Da kannst Du aber nur Buchstaben und Zahlen im "inline" Readingsname benutzen, und es muss mit einem Buchstabe anfangen.
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 09 März 2019, 00:33:48
Zitat von: amenomade am 08 März 2019, 23:54:29
Du kannst sogar preis-1 preis-2 preis-3 preis-4 umbenennen:

Zaubern reicht Dir nicht mehr - jetzt Gedanken lesen? <lacht>
Ich probierte mit userReadings rum, bekam es aber nicht hin, mehrere Readings auf einer Zeile ...

Dein Vorschlag funktioniert wunderfein.

Zitat von: amenomade am 08 März 2019, 23:54:29
Oder direkt ohne Name attr, nur als Regex:

Wir wollen mal nicht übertreiben, Dein erster Vorschlag ist schön. Damit werde ich Gasprom & Co langfristig zeigen, wo der Verbraucherhammer hängt, die werden sich noch wundern ... ;)
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 19 März 2019, 00:59:29
Ähmmm @amenomade : Darf ich Dich bitte etwas fragen?

Reading:

2019-03-18_23:12:02 Gaspreis gas_netto: 43,5


Ich kann dieses Reading nicht in einer Grafik darstellen, das dürfte daran liegen, dass da ein Komma an Stelle eines Punktes ist. Da weiß ich nicht weiter, das sollte die von Dir vorgeschlagene RegEx gern auch noch machen, natürlich für alle vier Readings.

Wenn ich vor etwas noch mehr Respekt habe als vor RegEx, dann ist es RegEx mit Punkten drin ...

Magst Du mir bitte helfen?
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: amenomade am 19 März 2019, 11:38:34
Probier mal mit attr <name> reading01OExpr $val =~ s/,/\./;; $val;;
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 19 März 2019, 21:39:33
@amenomade
Nach etwas probieren - das funktioniert super! Herzlichen Dank!
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 25 März 2019, 21:39:19
Neuer Fall - gleiches Spiel: Ich kann es immer noch nicht. In https://regex101.com/ funktioniert meine Konstruktion, im FHEM-Universum funktioniert sie nicht.

Es geht um "2,44 EUR" (also nur 2.44 natürlich) in https://www.finanzen.net/rohstoffe/Erdgas-Preis-Natural-Gas , der fragliche Quelltextteil ist


<div class="col-xs-12 col-sm-3">in Euro:</div>
<div class="col-xs-5 col-sm-3 text-sm-right text-nowrap">
2,44<span>EUR</span>


Meine Konstruktion (3600 ist nur wegen des Tests so niedrig, eigentlich natürlich ein Tag):


define Erdgas HTTPMOD https://www.finanzen.net/rohstoffe/Erdgas-Preis-Natural-Gas 3600
attr Erdgas userattr reading01Name reading01Regex
attr Erdgas enableControlSet 1
attr Erdgas event-on-change-reading erdgas
attr Erdgas icon gasoline
attr Erdgas reading01Name erdgas
attr Erdgas reading01Regex <div class=\"col-xs-12 col-sm-3\">in Euro\:<\/div>(\s+)<div class=\"col-xs-5 col-sm-3 text-sm-right text-nowrap\">(\s+)([\d].([\d.]+))<span>EUR<\/span>
attr Erdgas readingsSupervision 3700,,erdgas
attr Erdgas room 43 Gaspreis
attr Erdgas stateFormat {sprintf("%.2f €",ReadingsVal("Erdgas","erdgas",0))}
attr Erdgas timeout 5


Das tat wie gesagt in regex101.com - aber hier leider nicht. Was mache ich denn jetzt schon wieder falsch?
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 25 März 2019, 22:20:08
Haaaaaalt! Kommando zurück!

Es kann zaubern: Längere Zeit später stehen da vier Readings, erdgas-1 bis -4. Und in erdgas-3 steht der gewünschte Wert.

Allerdings habe ich nicht so genau verstanden, warum das so ist.
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: OdfFhem am 26 März 2019, 04:25:28
Entscheidend für das Anlegen der Readings sind die runden Klammerpaare - damit werden die sogenannten capturing groups gebildet.

Probier mal folgenden Ausdruck:

<div class=\"col-xs-12 col-sm-3\">in Euro\:<\/div>\s+<div class=\"col-xs-5 col-sm-3 text-sm-right text-nowrap\">\s+([\d].[\d.]+)<span>EUR<\/span>
Titel: Antw:RegEx - über mehrere Zeilen
Beitrag von: curt am 26 März 2019, 06:06:31
@OdfFhem
Du bist sooooooo gemein: Ich war so stolz, dass ich erstmals eine komplexe RegEx hinbekam ...

Nein, im Ernst: Sehr herzlichen Dank!
Deine Klammern machen genau das, was ich mir ursprünglich erträumte.

Danke!