FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Stargazer am 14 August 2016, 20:44:07

Titel: Regex-Term - wie bekomme ich nur die Zahlen ?
Beitrag von: Stargazer am 14 August 2016, 20:44:07
Hallo zusammen,

ich hatte ja in einem anderen Thread beschrieben, wie ich aus meinem HTTPMOD-Modul die Wetterdaten unserer Wetterstation auszulesen.

Im speziellen geht es um den Windmesser. Dieser gibt mit: (?s)>Wind</td>(.*?)<\/td>    folgendes aus:

1,1 m/s from 352° (N)

Die Rohdaten sehen so aus: <tr> <td class="stats_label">Wind</td> <td class="stats_data">1,7 m/s from 341° (NNW)</td> </tr>


Das läuft super, obwohl regex101.com sagt....nö...würde wohl nicht funktionieren. Es läuft aber perfekt.
Doch nun würde ich gerne nur den ersten Wert, sprich die 1,7, extrahieren. Da habe ich schon so manche Zeile in regex101.com versucht. Doch so richtig fruchtet es noch nicht.
Wenn es nur um diese eine Zeile ginge, würde   (?s)a">(.*?)\s    funktionieren. Doch leider haben alle Wetterparameter, die ausgelesen werden, die gleichen Zeichen, bis halt auf Parametername (>Wind<,>Barometer<..etc) und dessen Messwert.

Hier mal ein Auszug der Rohdaten:

HTTP/1.1 200 OK Date: Sun, 14 Aug 2016 18:09:14 GMT Server: Apache/2.4.10 (Raspbian) Last-Modified: Sun, 14 Aug 2016 18:05:26 GMT ETag: "334d-53a0bf5d0e48d" Accept-Ranges: bytes Content-Length: 13133 Vary: Accept-Encoding Connection: close Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head profile="http://www.w3.org/2005/10/profile"> <title>Löhne, Germany Current Weather Conditions</title> <link rel="stylesheet" type="text/css" href="weewx.css"/> <link rel="icon" type="image/png" href="favicon.ico" /> <script type="text/javascript"> function openURL(urlname) { window.location=urlname; } function openNoaaFile(date) { var url = "NOAA/NOAA-"; url = url + date; url = url + ".txt"; window.location=url; } </script> </head> <body> <div id="container"> <div id="masthead"> <h1>Löhne, Germany</h1> <h2>Current Weather Conditions</h2> <h2>14.08.2016 20:05:00</h2> </div> <div id="stats_group"> <div class="stats"> <div class="stats_header"> Current Conditions </div> <table> <tbody> <tr> <td class="stats_label">Outside Temperature</td> <td class="stats_data">20,5°C</td> </tr> <tr> <td class="stats_label">Wind Chill</td> <td class="stats_data">21,1°C</td> </tr> <tr> <td class="stats_label">Heat Index</td> <td class="stats_data">20,5°C</td> </tr> <tr> <td class="stats_label">Dewpoint</td> <td class="stats_data">14,3°C</td> </tr> <tr> <td class="stats_label">Humidity</td> <td class="stats_data">68%</td> </tr> <tr> <td class="stats_label">Barometer</td> <td class="stats_data">1022,8 mbar</td> </tr> <tr> <td class="stats_label">Barometer Trend (3 hours)</td> <td class="stats_data">0,4 mbar</td> </tr> <tr> <td class="stats_label">Wind</td> <td class="stats_data">1,7 m/s from 341° (NNW)</td> </tr> <tr> <td class="stats_label">Rain Rate</td> <td class="stats_data">0,0 mm/hr</td> </tr> <tr> <td class="stats_label">Inside Temperature</td> <td class="stats_data">21,7°C</td> </tr> </tbody> </table> </div> <p>&nbsp;</p> <div class="stats"> <div class="stats_header"> Since Midnight </div> <table> <tbody> <tr> <td class="stats_label"> High Temperature<br/> Low Temperature </td> <td class="stats_data"> 23,9°C at 15:06:56<br/> 16,4°C at 06:20:54 </td> </tr> <tr> <td class="stats_label"> High Heat Index<br/> Low Wind Chill </td> <td class="stats_data"> 23,9°C at 15:06:56<br/> 14,5°C at 06:25:00 </td> </tr> <tr> <td class="stats_label"> High Humidity<br/> Low Humidity </td> <td class="stats_data"> 84% at 03:10:58<br/> 52% at 13:52:59 </td> </tr> <tr> <td class="stats_label"> High Dewpoint<br/> Low Dewpoint </td> <td class="stats_data"> 17,0°C at 07:16:55<br/> 12,6°C at 18:05:02 </td> </tr> <tr> <td class="stats_label"> High Barometer<br/> Low Barometer </td> <td class="stats_data"> 1022,9 mbar at 20:03:01<br/> 1020,0 mbar at 04:30:00 </td> </tr> <tr> <td class="stats_label">Today's Rain</td> <td class="stats_data">0,0 mm</td> </tr> <tr> <td class="stats_label">High Rain Rate</td> <td class="stats_data">0,0 mm/hr at 00:00:01</td> </tr> <tr> <td class="stats_label"> High Wind </td> <td class="stats_data"> 5,9 m/s from 270° at 18:25:08 </td> </tr> <tr> <td class="stats_label"> Average Wind </td> <td class="stats_data"> 1,3 m/s </td> </tr> <tr> <td class="stats_label"> RMS Wind </td> <td class="stats_data"> 1,5 m/s </td> </tr> <tr> <td class="stats_label"> Vector Average Speed<br/> Vector Average Direction </td> <td class="stats_data"> 1,0 m/s<br/> 273° </td> </tr> <tr> <td class="stats_label"> High Inside Temperature<br/> Low Inside Temperature </td> <td class="stats_data"> 23,0°C at 14:00:00<br/> 20,2°C at 05:19:05 </td> </tr> </tbody> </table> </div> <!--End class "stats" --> <p>&nbsp;</p> </div> <!--End class "stats_group" --> <div id="content"> <div id="about"> <div class="header"> About this weather station: </div> <table> <caption class="caption">Location</caption> <tr> <td class="label">Latitude:</td> <td class="data">52&deg; 07.80' N</td> </tr> <tr> <td class="label">Longitude:</td> <td class="data">008&deg; 27.00' E</td> </tr> <tr> <td class="label">Altitude:</td> <td class="data">72 meters</td> </tr> </table> <p> This station uses a TFA Meteotime Duo, controlled by <a href="http://www.weewx.com">'weewx'</a>, an experimental weather software system written in Python. Weewx was designed to be simple, fast, and easy to understand by leveraging modern software concepts. </p> <p><a href="RSS/weewx_rss.xml">RSS feed</a></p> <p><a href="mobile.html">Mobile formatted</a></p> <p><a href="smartphone/index.html">Smartphone formatted</a></p> <p>Weewx uptime: 14 days, 9 hours, 4 minutes<br/> Server uptime: 15 days, 22 hours, 46 minutes<br/> weewx v3.4.0</p> </div> <!-- End id "about" --> <div id="almanac"> <div class="header"> Today's Almanac </div> <div class="celestial_group"> <div class="celestial_body"> <table> <caption class="caption">Sun</caption> <tr> <td class="label">Start civil twilight:</td> <td class="data">05:29:09</td> </tr> <tr> <td class="label">Sunrise:</td> <td class="data">06:08:24</td> </tr> <tr> <td class="label">Transit:</td> <td class="data">13:30:46</td> </tr> <tr> <td class="label">Sunset:</td> <td class="data">20:52:01</td> </tr> <tr> <td class="label">End civil twilight:</td> <td class="data">21:31:02</td> </tr> <tr> <td class="label">Azimuth:</td> <td class="data">285.3&deg;</td> </tr> <tr> <td class="label">Altitude:</td> <td class="data">6.0&deg;</td> </tr> <tr> <td class="label">Right ascension:</td> <td class="data">144.7&deg;</td> </tr> <tr> <td class="label">Declination:</td> <td class="data">14.1&deg;</td> </tr> <tr> <td class="label">Equinox:</td> <td class="data">22.09.2016 16:21:12</td> </tr> <tr> <td class="label">Solstice:</td> <td class="data">21.12.2016 11:44:02</td> </tr> </table> </div> <!-- end class "celestial_body" --> <div class="celestial_body"> <table> <caption class="caption">Moon</caption> <tr> <td class="label">Rise:</td> <td class="data">18:00:35</td> </tr> <tr> <td class="label">Transit:</td> <td class="data">22:27:32</td> </tr> <tr> <td class="label">Set:</td> <td class="data">02:04:21</td> </tr> <tr> <td class="label">Azimuth:</td> <td class="data">146.6&deg;</td> </tr> <tr> <td class="label">Altitude:</td> <td class="data">12.5&deg;</td> </tr> <tr> <td class="label">Right ascension:</td> <td class="data">278.0&deg;</td> </tr> <tr> <td class="label">Declination:</td> <td class="data">-19.3&deg;</td> </tr> <tr> <td class="label">Full moon:</td> <td class="data">18.08.2016 11:26:33</td> </tr> <tr> <td class="label">New moon:</td> <td class="data">01.09.2016 11:03:05</td> </tr> <tr> <td class="label">Phase:</td> <td class="data">Waxing gibbous<br/>(85% full)</td> </tr> </table> </div> <!-- end class "celestial_body" --> </div> <!-- end class "celestial_group" --> </div> <!-- end id "almanac" --> <div id="plots"> <img src="daytempdew.png" alt="temperatures" /> <img src="daytempchill.png" alt="heatchill" /> <img src="dayrain.png" alt="rain" /> <img src="daywind.png" alt="wind" /> <img src="daybarometer.png" alt="barometer"/> <img src="daywinddir.png" alt="Hi Wind" /> <img src="dayinside.png" alt="Inside" /> <img src="daywindvec.png" alt="Wind Vector" /> </div> <!-- End id "plots" --> </div> <!-- End id "content" --> <div id="navbar"> <input type="button" value=" Current " onclick="openURL('index.html')" /> <input type="button" value=" Week " onclick="openURL('week.html')" /> <input type="button" value=" Month " onclick="openURL('month.html')" /> <input type="button" value=" Year " onclick="openURL('year.html')" /> <p>Monthly summary:&nbsp; <select NAME=noaaselect onchange="openNoaaFile(value)"> <option value="2016-01">2016-01</option> <option value="2016-02">2016-02</option> <option value="2016-03">2016-03</option> <option value="2016-04">2016-04</option> <option value="2016-05">2016-05</option> <option value="2016-06">2016-06</option> <option value="2016-07">2016-07</option> <option value="2016-08">2016-08</option> <option selected>-Select month-</option> </select> <br/> Yearly summary:&nbsp; <select NAME=noaaselect onchange="openNoaaFile(value)"> <option value="2016">2016</option> <option selected>-Select year-</option> </select> </p> </div> </div> </body> </html>

Welchen Term brauche ich da, damit ich nur den Zahlenwert habe ?

Viele Grüße und vielen Dank

André
Titel: Antw:Regex-Term - wie bekomme ich nur die Zahlen ?
Beitrag von: Icinger am 14 August 2016, 20:59:02
(?s)>Wind<\/td>.*?>([\d,]*)

regex101 gibt mir bei deinen Rohdaten für den obigen RegEx genau die "1.7" zurück...

lg, Stefan

Edit: Wenn du mehrere Werte willst (also zB Baro oder Wind) nimm einfach
(?s)>(Wind|Barometer)<\/td>.*?>([\d,]*)
das gibt dann ein:
ZitatMATCH 1
1.   [1607-1616]   `Barometer`
2.   [1645-1651]   `1022,8`
MATCH 2
1.   [1800-1804]   `Wind`
2.   [1833-1836]   `1,7`
Titel: Antw:Regex-Term - wie bekomme ich nur die Zahlen ?
Beitrag von: Stargazer am 14 August 2016, 22:00:09
Hi Stefan,

da hätte ich noch länger dran feilen müssen, um den Term zu bekommen. Mit den eckigen Klammern bin ich zwar auch schon angefangen, aber der Rest hätte noch gedauert.

Vielen Dank für die schnelle Hilfe !

VG

André