iT邦幫忙

DAY 28
1

蠻可愛的資料庫與資料處理系列 第 28

過濾資料探討8

分組與多選結構2

昨天探討了運用分組與多選結構,並以IP位址作範例.
但是資料是由人或人設計出來的設備產生的,人類有
喜歡整齊的傾向,所以有時候會遇到一些補滿位數的
情況,例如 6 寫成 006, 37 寫成 037,這樣的格式.
遇到這種情況,昨天的方法,就會把上述的例子過濾掉了.

今天探討改進的方案.

位數   範圍   原正規式         補位                          新正規式
1位    0-9    [0-9]         (00)可能不出現,出現最多一次    (00)?[0-9]
2位   10-99   [0-9]{2}        0 可能不出現,出現最多一次       0?[0-9]{2}
3位   100-255                   不需要                        維持不變
分三組 
      100-199 1[0-9][0-9]
      200-249 2[0-4][0-9]
      250-255 25[0-5]

所以可以改成

part=r"^((00)?[0-9]|0?[0-9]{2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"

驗證:

In [1]: import re

In [2]: part=r"^((00)?[0-9]|0?[0-9]{2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"

In [3]: re.search(part, "000") != None
Out[3]: True

In [4]: re.search(part, "099") != None
Out[4]: True

In [5]: re.search(part, "168") != None
Out[5]: True

In [6]: re.search(part, "256") != None
Out[6]: False

日期時間格式

日期時間格式的判斷,也是容易遇到有人會補0,所以可以用同樣的招數.

月

範圍   1-9月           正規式
1-12   1-9 or 01-09    0?[1-9]
       10-12月         1[012]

驗證

In [7]: month=r"^(0?[1-9]|1[012])$"

In [8]: re.search(month, "01") != None
Out[8]: True

In [9]: re.search(month, "9") != None
Out[9]: True

In [10]: re.search(month, "12") != None
Out[10]: True

In [11]: re.search(month, "13") != None
Out[11]: False

日,小時,分鐘也是照同樣要領.

以下是正規式對照

日   (0?[1-9]|[12]\d|3[01])     分別對應 1-9補或不補0, 10-29, 30-31
小時 (0?[1-9]|1\d|2[0-4])       分別對應 1-9補或不補0, 10-19, 20-24
分鍾 (0?[1-9]|[1-5]\d|60)       分別對應 1-9補或不補0, 10-59, 60

上一篇
過濾資料探討7
下一篇
將資料快速導向Gnuplot畫圖的輔助程式 Feedgnuplot
系列文
蠻可愛的資料庫與資料處理30

尚未有邦友留言

立即登入留言