FHEM Forum

FHEM => Sonstiges => Thema gestartet von: stera am 28 Mai 2020, 13:07:18

Titel: httpMod Hilfe
Beitrag von: stera am 28 Mai 2020, 13:07:18
Hallo zusammen,

ich tue mich leider immer noch so schwer mit dem RegEx(en)  ::)
Ich möchte von einer lokalen Wetterstationsseite gerne paar Daten rausfiltern.. Es gibt leider im Aufbau immer die gleichen Tabellen und ähnlich aufgebaut wie der untere Ausschnitt. Kann man auch nach was bestimmtes suchen und dann die nächste Zahl mit Komma oder Zahlen vor °C rausfiltern?

Wenn ich im RegEx anfange mit <nobr>Lufttemperatur.*°C  funktioniert der Match nicht, weil er bei einem Zeilenumbruch aufhört.. Irgendwann muss ich das doch mal verstehen  :-\
Bitte um Hilfestellung.



<nobr>Lufttemperatur  2 m</nobr></b></font></td>
<td align="center" width="7%" height="46"><img border="0" src="temp.gif" width="32" height="40"></td>
<td align="center" colspan="7"><table border="1" width="100%">
<td align="center" colspan="3" width="19%"><b><font size="1">aktuell</font></b><br><b><font size="5">13,8°C</font></b></td>



Danke,
Stefan





Titel: Antw:httpMod Hilfe
Beitrag von: stera am 28 Mai 2020, 13:13:12
So damit funktioniert zumindestens das matchen.
Lufttemperatur[\d\D]{600,900}C

Nun muss ich die Gruppe davor bilden, dass es auch geht mit 15,4 oder 3,1 oder -2,3 usw...
Titel: Antw:httpMod Hilfe
Beitrag von: amenomade am 28 Mai 2020, 18:02:31
Zitatweil er bei einem Zeilenumbruch aufhört.
Dafür readingXXRegOp s setzen, oder (?s) am Anfang der Regex schreiben

(?s)Lufttemperatur.*?>(-?[0-9]+,?[0-9]*)sollte machen was Du willst
Titel: Antw:httpMod Hilfe
Beitrag von: Christoph Morrison am 28 Mai 2020, 18:17:16
Zitat von: amenomade am 28 Mai 2020, 18:02:31
(?s)Lufttemperatur.*?>(-?[0-9]+,?[0-9]*)sollte machen was Du willst

Wenn du das ? hinter .* wegmachst, braucht der Regex-Automat nur rund 15% der Steps um zum gleichen Ergebnis zu kommen. .* impliziert ja ein ? (beliebig viele Zeichen heißt auch keines).
Titel: Antw:httpMod Hilfe
Beitrag von: amenomade am 28 Mai 2020, 18:23:44
Schlechter Hinweis.
Wenn Du jetzt 65000 Zeichen nach dem HTML Extrakt schreibst (ich gehe davon aus, dass die Seite von stera noch weitere Sachen enthält, da man den /body nicht sieht), braucht die Regex 65000 steps mehr.
Und wenn innerhalb dieser 65000 Zeichen irgendeine Zahl noch vorkommt, wird er diese Zahl statt die Lufttemperatur nehmen.

.* = nicht gierig. Matcht so viel wie möglich, und geht dann Rückwerts bis er etwas findet.
.*? = gierig: so wenig wie möglich

Mach den Test in regex101 mit <nobr>Lufttemperatur  2 m</nobr></b></font></td>
<td align="center" width="7%" height="46"><img border="0" src="temp.gif" width="32" height="40"></td>
<td align="center" colspan="7"><table border="1" width="100%">
<td align="center" colspan="3" width="19%"><b><font size="1">aktuell</font></b><br><b><font size="5">13°C</font></b></td>
zefqzmefiokqzmefokqzùepofkùqzepofkùqzepfokqzùepf
okqzùefpokqzeùfpokqzùepfokqzùepofkzqùepofkùqzepofkqùzepofkq
ùzepofkqzùepofkqzùepofkùqzepofkùqzepokfùqzepofkùqzepofk
qùzepofkùqzepofkùqzepofkqùzepofkqzùepofkqùze
pofkùqzepofkùqzep
ofkùqzeokfùqzepokfùqzepofkùqzepokfùqzepofkùpqezokfùqzepo
kfùqzepokfùpqezokfùqzepokfqzmepofkqmzepo*fkùqzepokfùqzepokfùqz
epokfùqzepok<Höhe>fùqpezokfùqzepokfùqpzoekfùqpzoekfùpqzoekfùpqzoekfùpqezokfùpqezokfùpqzoekfùqzepokf>12000zmeofijzemofijzmeoifjmzoeijfmoijzemoifjmzoiejfmozeijfzefqzmefiokqzmefo
kqzùepofkùqzepofkùqzepfokqzùepfokqzùefpokqzeùfpokqzùepfokqzùepofkzqùepofkùqzepofkqùzepofkqùzepofkqzùepofkqzùepofkùqzepofkùqzepokfùqzepofkùqzepofkqùzepofkùqzepofkùqzepofkqùzepofkqzùepofkqùzepofkùqzepofkùqzepofkùqzeokfùqzepokfùqzepofkùqzepokfùqzepofkùpqezokfùqzepokfùqzepokfùpqezokfùqzepokfqzmepofkqmzepofkùqzepokfùqzepokfùqzepokfùqzepokfùqpezokfùqzepokfùqpzoekfùqpzoekfùpqzoekfùpqzoekfùpqezokfùpqezokfùpqzoekfùqzepokf
als Teststring
Ohne ? kriegst Du 12000 als Ergebnis, und mit 512 steps
Nimmst Du die Zeile mit Höhe und 1200 (in meinem Beispiel die Vorletzte) näher von Lufttemperatur , werden immer mehr steps benötigt
Titel: Antw:httpMod Hilfe
Beitrag von: Christoph Morrison am 28 Mai 2020, 18:37:04
Dein Teststring matcht gar nicht. Verlinke doch einfach deinen Case, links oben bei Regex101, "Save Regex", dann bekommst du einen direkten Link den du teilen kannst.
Titel: Antw:httpMod Hilfe
Beitrag von: amenomade am 28 Mai 2020, 18:45:37
Weil ich das obere Teil mit Lufttemperatur vergessen hatte, zu kopieren
https://regex101.com/r/WYZU59/1

Titel: Antw:httpMod Hilfe
Beitrag von: amenomade am 28 Mai 2020, 18:46:49
Eine sehr interessante Funktion, wenn Du nicht überzeugt bist, ist links TOOLS > Regex debugger. Da wirst Du step by step in einer Animation sehen, was er macht.
Vergleiche mit und ohne "?"
Titel: Antw:httpMod Hilfe
Beitrag von: stera am 29 Mai 2020, 07:24:24
Guten Morgen,

vielen Dank für die Antworten. Ich wollte nun keine Debatte hier auslösen  ::)
Das hilft mir nun schon gut weiter.

Danke,
Stefan
Titel: Antw:httpMod Hilfe
Beitrag von: Christoph Morrison am 29 Mai 2020, 09:14:36
Zitat von: stera am 29 Mai 2020, 07:24:24
vielen Dank für die Antworten. Ich wollte nun keine Debatte hier auslösen  ::)

Guten Morgen,

keine Sorge, genau dafür sind Foren da.
Titel: Antw:httpMod Hilfe
Beitrag von: stera am 29 Mai 2020, 13:08:29
Kann mir hier jemand nochmal sagen, warum das mit dem Umlaut nicht funktioniert..


gehen leider alle nicht   :(

attr WetterNF reading09Encode UTF-8
attr WetterNF reading09Name WindboenAktuell
attr WetterNF reading09Regex (?s)<nobr>Windböen.*?>(-?[0-9]+,?[0-9]*)

oder

attr WetterNF reading09Name WindboenAktuell
attr WetterNF reading09Regex (?s)<nobr>Windb&ouml;en.*?>(-?[0-9]+,?[0-9]*)

oder

attr WetterNF reading09Encode UTF-8
attr WetterNF reading09Name WindboenAktuell
attr WetterNF reading09Regex (?s)<nobr>Windb&ouml;en.*?>(-?[0-9]+,?[0-9]*)





Regex auf regex101 funktioniert mit dem ersten:
<tr><td width="22%" height="46"><font color="Gray"><b><nobr>Windböen</nobr></b></font></td>
<td align="center" width="7%" height="46"><img border="0" src="windb.gif" width="53" height="40"></td>
<td align="center" colspan="3" width="19%"><b><font size="1">aktuell</font></b><br><b><font size="5">24,1km/h<BR>4 Bft</font></b></td>
<td align="center" width="11%" colspan="2"><font size="1"><b>Max.</b>(12:08)<br></font><b><font size="4">NW 35,4km/h<BR>5 Bft</font></b></td>

Titel: Antw:httpMod Hilfe
Beitrag von: amenomade am 29 Mai 2020, 19:48:43
Zitat von: Christoph Morrison am 29 Mai 2020, 09:14:36
Guten Morgen,

keine Sorge, genau dafür sind Foren da.

Möchte aber trotzdem gerne wissen, was Du feststellen konntest ;)
Titel: Antw:httpMod Hilfe
Beitrag von: Christoph Morrison am 02 Juni 2020, 10:22:46
Zitat von: amenomade am 29 Mai 2020, 19:48:43
Möchte aber trotzdem gerne wissen, was Du feststellen konntest ;)

Letztlich hab ich für dich die gleiche Antwort wie für den OP mit seiner Frage über dir: Nur aus einem Ausschnitt kann man zwar eine Lösung konstruieren, aber die muss nicht zwangsweise die beste/eleganteste/generell funktionierende Lösung sein.

Mein Regex matcht im Beispiel vom OP effizienter als deiner, in einem anderen Setting tut er es nicht. Wir kennen das Setting aber nicht, deshalb:

@stera: Poste doch mal bitte alles. D.h. du postest die komplette Ergebnisseite, sensitive Daten kannst du ja ausXen. Dann können wir dir auch besser helfen.