RegEx - über mehrere Zeilen

Begonnen von curt, 08 März 2019, 04:42:17

Vorheriges Thema - Nächstes Thema

curt

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?
RPI 4 - Jeelink HomeMatic Z-Wave

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Christoph Morrison

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.

curt

Nein. Es steht dort immer eine Ziffer 0..5.
RPI 4 - Jeelink HomeMatic Z-Wave

curt

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?
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

(?s)name="ost".*?<td>.*?<td>([\d,]+).*?<td>([\d,]+).*?<td>([\d,]+).*?<td>([\d,]+)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

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!
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

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 ... ;)
RPI 4 - Jeelink HomeMatic Z-Wave

curt

Ä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?
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

Probier mal mit attr <name> reading01OExpr $val =~ s/,/\./;; $val;;
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

@amenomade
Nach etwas probieren - das funktioniert super! Herzlichen Dank!
RPI 4 - Jeelink HomeMatic Z-Wave

curt

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?
RPI 4 - Jeelink HomeMatic Z-Wave

curt

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.
RPI 4 - Jeelink HomeMatic Z-Wave

OdfFhem

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>

curt

@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!
RPI 4 - Jeelink HomeMatic Z-Wave