[python] regulární výrazy

Lumír Balhar frenzy.madness na gmail.com
Úterý Červen 30 07:23:49 CEST 2015


Ahoj.

Pro každá vstupní data by se dal napsat regulární výraz, který by je testoval. V Pythonu je k tomu určen modul re.

Například pro stav relé by to mohlo vypadat takto:

import re
re.match(r'^[01]{10}$', '1010010110')

re.match testuje regulární výraz proti zadanému vstupu. Pokud vyhovuje, vrátí ti Match object, pokud nesedí, vrátí None. Konkrétně tento testuje, zda je celý řetězec kombinací jen jedniček a nul v počtu deseti. Pokud tam bude kdekoli jakýkoli jiný znak, nebo bude vstup delší či kratší, bude vracet None.

Analogicky pro stav napětí (to samé, jen pro kratší řetězec):

re.match(r'^[01]{2}$', '01')

Pro stav teplot je to drobet složitější, ale princip je pořád stejný:

re.match(r'^[0-9]{4}\|[0-9]{4}\|[0-9]{4}\|$', '1256|1360|1150|')

Jednoduše řečeno - hledej od začátku čísla 0-9 v počtu čtyř, pak svislítko, pak další čtyři čísla, pak zase svislítko atp. až do konce.

Na poslední vstup bych regulární výrazy nepoužil. Místo toho bych si datum nechal konvertovat do objektu datetime takto:

from datetime import datetime
datetime.strptime('23.06.2015 16:01:35', '%d.%m.%Y %H:%M:%S')

Funkce v tomto případě vyrobí objekt reprezentující datum a čas rozparsované z řetězce dle zadaného formátu. Pokud by řetězec tomuto formátu neodpovídal, funkce vyvolá výjimku. Výjimku také vyvolá, pokud by na vstup přišlo nějaké nesmyslné datum jako 32. den v měsíci či 17. měsíc apod.

Snad je to srozumitelné. Před použitím doporučuji otestovat, zda naměřené hodnoty opravdu odpovídají těmto reg. výrazům.

Hezký den.
Lumír


Dne pondělí 29. června 2015 21:07:36 UTC+2 "Ing. Vladislav Ludík" napsal(a):
> Zdravím,
> 
> moje elektronika mi vrací po sériovém portu několik druhů dat:
> 
> stav relé: "010101010101" - 10-ti místný výstup 0 nebo 1
> stav napětí: "01" - 2-místný výstup 0 nebo 1
> stav teplot: "1256|1360|1150|" 15-ti místný výstup tří skupin oddělených |
> datum a čas: "23.06.2015 16:01:35" 19-ti místný výstup
> 
> Složitě to otestovat umím.
> Test by měl rozpoznat chybnou délku, formát a nelegální znaky 
> testovaných dat.
> Chtěl bych použít co nejjednodušší test.
> Zatím se mi to moc nedaří.
> Poradí mi někdo ?
> 
> Díky Vláďa
> 
> 
> 
> --- news://freenews.netfront.net/ - complaints: news na netfront.net ---


Další informace o konferenci Python