2011年2月16日 星期三

10 - 1 正規表示-1

W覺得正規表示法太重要了, 有多重要?

shell script 用不用?

perl 用不用?

Tcl 用不用?

想當然python絕對是不能缺席的!

所以只能說~~太太太重要了!

當讀者需要處理大量的文字訊息, 例如一整個網頁, 一份log, 逐字逐句的看嗎?

100行以內可能還可以辦到, 倘若1000000行, 或甚至更多的時候, 該怎麼辦?

好在, 早就有人發現了這個問題, 發明了regular expression (正規表示),

它的好處是可以處理掉讀者不想閱讀的部份, 或是過濾掉不必要的訊息,

只清楚地顯示你所需要的那一部份..


這樣解釋或許有點讓人不清楚, 讓我們看看以下的例子


在python之中, 要使用regular expression (簡稱regex), 只要import re這個模組,

ex1:
>>> import re
>>> pat='abc'
>>> string='123 abc'
>>> match = re.search(pat,string)
>>> match.group()
'abc'
>>>

在例子1當中,
1. 我們import re, re指的就是正規表示(regex)
2. 定義了要檢查的樣式(pattern), pat = 'abc', 意思是要找含有'abc'的樣式
3. string = '123 abc' 指的是將被搜尋的字串
4. 定義了match, 指的是如果正規表示找到了含有abc的字串, 把結果存入match這個物件(object)之中
5. re.search(patter,string), 當使用 re的search功能, 第一個需要放入檢驗用的樣式(pattern), 第二要放入將被搜尋的字串(string)
6. 透過 match.group()可以顯示出找到的字串

讓我們再看看下一個例子
ex2:
>>> string='123 abc abc abc'
>>> match = re.search(pat,string)
>>> match.group()
'abc'
>>>

在這, 我們可以發現search, 只會配對一次, 就算後面還有也不會處理,
所以match.group()只會單單顯示一個結果,
那如果我們想要找到所有的結果呢?

python 當然早就準備好囉!請看下面一個例子,

ex3:
>>> match = re.findall(pat,string)
>>> match
['abc', 'abc', 'abc']

我們在這用了 findall(), 用法跟search 十分相似, 也需要給pattern跟string.
,然後結果會返回一個串列(list), 如上所示.找到了三組'abc'

應該比想像中簡單吧? 在讓我們實驗一下下面這個例子,

ex4:
>>> pat = 'cde'
>>> match = re.search(pat,string)
>>> match
>>> type(match)

>>> match.group()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'NoneType' object has no attribute 'group'
>>>

1. 在這個例子, W把pat換成'cde', 當然會在string找不到配對成功的結果,
2. match這個物件(object)變成None, 因為re.search()找不到所以返回(return)一個空值(None)
3. W順便利用一下type(), 來檢驗一下match這個物件(object)的形態
4. 如上所示, type 是空值
5. 所以match.group()會有錯誤訊息告訴讀者, 沒有group這個屬性(attribute)

經過上面幾個例子的練習, W想大家應該對re摸組的search跟findall有一定的認識了,



不過老實說,

W還沒開始介紹真正的正規表示(regex), 嘿嘿~

其實正規表示指的是利用某些通用的符號或是正規表示的關鍵字, 達到處理字串的效果.

在正規表示的一開始, 總要先瞭解一下有那些function可以使用, 該怎麼用, 然後再來學習regex,

各位看官您說是吧?


在下一個篇幅, W就要正式切入正規表示法囉, 請務必練習一下上面的例子!

1 則留言: