Hauptmenü

regexp-crack gesucht

Begonnen von the ratman, 04 Juni 2016, 18:18:25

Vorheriges Thema - Nächstes Thema

the ratman

hiho,

ich hab ein problem - besser 2 *g*

erstes problem:
ich stehe mit regexp zu 100,01% auf kriegsfuß. es haben schon ausgewachsene programmierer schon vor jahren versucht, mirs direkt vor ort zu erklären und sind kläglich daran gescheitert ...

zweites problem:
ich habe einen raum in fhem, den ich per http abrufeURL=http://192.168.178.10:8083/fhem?cmd=list%20room=Rainmeter%20state%20sabotageError%20pct%20rgb&XHR=1soweit so gut.
in meinem fall liefert obige abfrage nun mit RegExp=(?si)(.*) <-- dies ist eine abfrage im tool "rainmeter" unter winfolgendes zurück:1K12V                2016-06-04 17:32:17   state           MISSING ACK
                     2016-05-31 12:00:39   pct             0
4K12V_Schalter1      2016-06-04 14:29:02   state           off
                     2016-06-04 14:29:02   pct             0
4K12V_Schalter2      2016-06-04 14:44:21   state           off
                     2016-06-04 14:44:21   pct             0
4K12V_Schalter3      2016-06-04 12:06:32   state           off
                     2016-06-04 12:06:32   pct             0
4K12V_Schalter4      2016-06-04 12:06:32   state           off
                     2016-06-04 12:06:32   pct             0
Buecherregal_RGB     2016-06-04 08:30:21   state           off
                     2016-06-04 08:30:21   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
Buero_Deckenlicht    2016-06-04 08:30:30   state           off
                     2016-06-04 08:30:28   pct             0
Buero_RGB            2016-06-04 08:30:21   state           off
                     2016-06-04 08:30:21   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
MK_Badezimmertuer    2016-06-04 17:13:40   state           open
                     2016-06-04 17:13:40   sabotageError   off
MK_Fliegengitter     2016-06-04 16:07:54   state           closed
                     2016-06-04 11:54:29   sabotageError   on
MK_Katzentuer        2016-06-04 08:03:47   state           open
MK_Schiebetuer       2016-06-04 11:54:29   state           open
MK_Schlafzimmer_Fenster 2016-05-31 06:36:04   state           open
                     2016-05-27 09:38:07   sabotageError   on
MK_Treibhaus_Fenster 2016-06-04 13:12:47   state           open
                     2016-06-04 13:12:47   sabotageError   on
MK_Wohnzimmer_Innenzugang 2016-06-04 16:03:48   state           closed
SZ_Terrasse_Rollo    2016-06-04 14:45:42   state           98
                     2016-06-04 14:45:42   pct             98
Schlafzimmer_RGB     2016-06-04 10:11:14   state           off
                     2016-06-04 10:11:14   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
Sofa_Deckenlicht     2016-06-04 08:30:34   state           off
                     2016-06-04 08:30:32   pct             0
Sofa_RGB             2016-06-04 08:30:21   state           off
                     2016-06-04 08:30:21   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
Terrasse_Wandlampe   2016-06-04 14:45:13   state           off
                     2016-06-04 14:45:13   pct             0
Treibaus_Tuer        2016-06-04 16:01:10   state           closed
WZ_Strasse_Rollo     2016-06-04 08:30:35   state           off
                     2016-06-04 08:30:35   pct             0
WZ_Terrasse_Rollo    2016-06-04 16:07:54   state           off
                     2016-06-04 16:07:54   pct             0
soweit find ich das schon mal o.k.

nun der teil, den ich selber nicht hin kriege:

was ich jetzt bräuchte, wäre eine liste, die ich mit einem regexp erstellen wollen würde - im sinne von in etwa:
wert1.1 wert1.2 wert1.3 wert2.1 wert2.2 wert2.3 ...
ich kann hinter nem regexp auch noch NACH der abfrage substituieren nach dem motto: ersetze x durch y, in denen auch regexp möglich wäre.
was nicht sein muß ist vorausschauendes arbeiten. ich binde mir eventeull neue geräte dann schon händisch ein. die geräte bleiben eh immer die selben.
meine probleme fangen schon damit an, dass ich ja nie alle werte zu allen devices kriege und somit mit der michlmädchenrechnung "zähle bis 3, der nächste wert ist das nächste gerät" nicht wirklich weiter komme.

aja, sinn und zweck der übung:
ich baue mit dem tool rainmeter ein skin, dass direkt auf meinem win-desktop schön grafisch den zustand div lampen, kontakte, ... darstellen soll. quasi ein "floorplan für arme".
das problem dabei ist, dass ein abfragen der einzelnen geräte zu errors führt, weil der hausserver mich für nen bösen ddos-dödel hält.
nun war mein gedankengang einfach nur einen raum abzufragen, weil ich den problemlos mehrmals die sekunde abfragen darf, ohne dass der server mit mir böse wird.
und noch zur info: spielchen wie telnet sind mit dem rainmeter leider nicht möglich. ich kann eben nur http-seiten auseinander dröseln. schon das senden von befehlen an fhem geht nur mit zusätzlichen tools. aber die richtung hab ich eh im griff.

kann man mir da weiter helfen?
→do↑p!dnʇs↓shit←

Rumbel

ich glaub, ich hab nicht zu 100% verstanden, was du willst, aber hier mal eine möglichkeit

das ist sicher werder die schönste noch die trivialste variante und ich hab das nur trocken getippt (außer die regexe, die sind mittels http://regexr.com/ getestet), aber ich denke, es sollte funktionieren. :-)

aus

1K12V                2016-06-04 17:32:17   state           MISSING ACK
                     2016-05-31 12:00:39   pct             0
4K12V_Schalter1      2016-06-04 14:29:02   state           off
                     2016-06-04 14:29:02   pct             0
4K12V_Schalter2      2016-06-04 14:44:21   state           off
                     2016-06-04 14:44:21   pct             0
4K12V_Schalter3      2016-06-04 12:06:32   state           off
                     2016-06-04 12:06:32   pct             0
4K12V_Schalter4      2016-06-04 12:06:32   state           off
                     2016-06-04 12:06:32   pct             0
Buecherregal_RGB     2016-06-04 08:30:21   state           off
                     2016-06-04 08:30:21   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
Buero_Deckenlicht    2016-06-04 08:30:30   state           off
                     2016-06-04 08:30:28   pct             0
Buero_RGB            2016-06-04 08:30:21   state           off
                     2016-06-04 08:30:21   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
MK_Badezimmertuer    2016-06-04 17:13:40   state           open
                     2016-06-04 17:13:40   sabotageError   off
MK_Fliegengitter     2016-06-04 16:07:54   state           closed
                     2016-06-04 11:54:29   sabotageError   on
MK_Katzentuer        2016-06-04 08:03:47   state           open
MK_Schiebetuer       2016-06-04 11:54:29   state           open
MK_Schlafzimmer_Fenster 2016-05-31 06:36:04   state           open
                     2016-05-27 09:38:07   sabotageError   on
MK_Treibhaus_Fenster 2016-06-04 13:12:47   state           open
                     2016-06-04 13:12:47   sabotageError   on
MK_Wohnzimmer_Innenzugang 2016-06-04 16:03:48   state           closed
SZ_Terrasse_Rollo    2016-06-04 14:45:42   state           98
                     2016-06-04 14:45:42   pct             98
Schlafzimmer_RGB     2016-06-04 10:11:14   state           off
                     2016-06-04 10:11:14   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
Sofa_Deckenlicht     2016-06-04 08:30:34   state           off
                     2016-06-04 08:30:32   pct             0
Sofa_RGB             2016-06-04 08:30:21   state           off
                     2016-06-04 08:30:21   pct             0
                     2016-06-04 08:30:21   rgb             ffc698
Terrasse_Wandlampe   2016-06-04 14:45:13   state           off
                     2016-06-04 14:45:13   pct             0
Treibaus_Tuer        2016-06-04 16:01:10   state           closed
WZ_Strasse_Rollo     2016-06-04 08:30:35   state           off
                     2016-06-04 08:30:35   pct             0
WZ_Terrasse_Rollo    2016-06-04 16:07:54   state           off
                     2016-06-04 16:07:54   pct             0


wird mittels 3x regex
my $sLine = DEIN_TEXT_HIER;
$sLine =~ s/(^([^\W]*).*state\W*(.*)$)|(^.*$)/$2=$3,/gm;
$sLine =~ s/((.+=.+),)|(=,)/$2/gm;
$sLine =~ s/^(?:[\t ]*(?:\r?\n|\r))+//gm;


dann das hier:

1K12V=MISSING ACK
4K12V_Schalter1=off
4K12V_Schalter2=off
4K12V_Schalter3=off
4K12V_Schalter4=off
Buecherregal_RGB=off
Buero_Deckenlicht=off
Buero_RGB=off
MK_Badezimmertuer=open
MK_Fliegengitter=closed
MK_Katzentuer=open
MK_Schiebetuer=open
MK_Schlafzimmer_Fenster=open
MK_Treibhaus_Fenster=open
MK_Wohnzimmer_Innenzugang=closed
SZ_Terrasse_Rollo=98
Schlafzimmer_RGB=off
Sofa_Deckenlicht=off
Sofa_RGB=off
Terrasse_Wandlampe=off
Treibaus_Tuer=closed
WZ_Strasse_Rollo=off
WZ_Terrasse_Rollo=off


über einen split könnte man das dann zeile für zeile bearbeiten

beliebige for-schleife
($Sensor,$State) = split /,/ $Zeile;
mit $Sensor und $State arbeiten
ende der for-schleife


hat das geholfen?
Fhem auf Raspberry Pi 3 mit HMLAN + viel HomeMatic-Zeugs / VU+ duo2 / Webcam an Synology Surveillance Station auf DS213+ / LD382A LED Module /Netatmo Wetterstation ... und mehr kommt sicher bald ;-)

the ratman

#2
uij, vielen dank für deine mühen. jetzt muß ich das nur mehr in meinem tool umsetzen.
ich bin wieder mal fasziniert, wie wenig (nämlich 0%) ich von deinen 3 regex-zeilen verstehe *g*.

wenn das funzt, hast auf jeden fall jemanden echt glücklich gemacht!
an der lösung dieses problems knabber ich seit anfang des jahres und habs eig. schon aufgegeben gehabt.


nachtrag
die regex funzt schon mal. schaut zumindest shcon mal gut aus.
fürs zerlegen in einzelne zeilen muß ich mir noch was einfallen lassen. rainmeter gibt das nicht direkt her (stark abgespecktes lua-script), aber es sollte gehen (muß ich mich aber noch einlesen).
→do↑p!dnʇs↓shit←