iT邦幫忙

DAY 27
0

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

過濾資料探討7

分組與多選結構

分組

前面介紹了量詞,若我們想要檢查資料裡面"ab"是否至少出現一次,
嗯,至少出現一次的量詞是 +, 那寫成 ab+ 呢.
這樣 + 只對緊貼著的 b有效.

來看實例:

In [5]: re.search(r"ab+", "ab") != None
Out[5]: True

In [6]: re.search(r"ab+", "abb") != None
Out[6]: True

In [7]: re.search(r"ab+", "abab") != None
Out[7]: True

In [8]: re.search(r"^ab+$", "abab") != None
Out[8]: False

第8項就不符合了.

要使用()才正確!

In [9]: re.search(r"^(ab)+$", "abab") != None
Out[9]: True

多選結構

例如我們想找出Python或是Ruby的書籍,可以使用 (Python | Ruby)
這樣的方式表達,簡單說就是OR.

應用實例像是用來過濾IP Address,先把問題簡化,過濾其中一段.
我們都知道範圍是1~255,那要如何表達呢?
也許馬上想到的是

[0-9]{1,3} 意義是0-9的數字,最少出現1次,最多出現3次.
但是這樣256,999這類不合的也不會過濾掉.

也許有人會想說 轉成integer,再用 if 0 <= ip && ip <= 255
但是這樣要到程式內判斷.

我們可以先將狀況分種三種

位數   範圍   正規式
1位    0-9    [0-9]
2位   10-99   [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]

看以下驗證

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

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

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

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

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

還可以應用在月,日,小時,分鐘等判斷.


上一篇
過濾資料探討6
下一篇
過濾資料探討8
系列文
蠻可愛的資料庫與資料處理30

尚未有邦友留言

立即登入留言