2011年2月16日 星期三

10 - 1 正規表示-2

在上一個篇幅裡, W簡單的介紹了 search 跟 findall的功能(function),
還有如何使用pattern的概念.如果忘記了, 可以回第一篇復習一下 :)

在這個章節裡, 我們將更深入pattern的內部,了解有哪些regex的關鍵字可以使用,
及相對應的語法.

正規表示(regex)關鍵字:

. 任何字元,數字,符號,及空格
\w 任何字元,數字
\d 任何數字
\s 任何空格
+ 1個或1個以上
* 0個或0個以上

接下來,我們來看看以下的例子.

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

pat='..c', 指的是找到三個字元,且最後一個字元為c的pattern,
所以會返回一個值, 'abc',
讀者可以試試看,找出開頭為1的pattern,那pat = ?


為了可以簡化流程, W在這裡多加一個功能(function)

def find(pattern, string):
match = re.search(pattern,string)
if match: print match.group()
else: print "not find"

讀者可以藉由這項功能, 不用狂打字, 可以專心練習正規表示的符號.

ex2: (找出開頭為1的pattern)
>>> pat='1..'
或者可以是,
>>> pat = r'\d+'
>>> find(pat,string)
123

pat = r'\d+' 在這個pattern, \d指的是"1"個數字, +加號表達是1個以上的數字,
既然要找的是'123',我們須要有一個以上的數字在我們的pattern之中, 所以要把+加號放在\d的後面, 然後find就會返回一個字串'123'


讓我們再試試看這個例子,

ex3:W把string改成 '1 2 3 123 abc cde', pattern該如何改才可以找到'123'?
>>> string = '1 2 3 123 abc cde'
>>> find(pat,string)
123

因為在'123'前面有三個單獨的數字'1', '2', '3', 很顯然 pat = r'\d+'會match所有的數字,
而我們卻只想要有三個數字黏在一起的'123', 下面是W給的pattern

>>pat = r'\d{3}' , 這樣的寫法表示, 只有三個數字不能多也不能少才是W要的,
然後regex就會去比對,
''1', '2','3'都是單一的數字, 所以不合乎我們的要求, 到了'123', 三個數字,
bingo!找到了黏在一起的'123',
除此之外, W相信大家注意到了, W在單引號(quote)前面放一個'r',
小寫r表示raw string, 意思是python不須要做任何特殊處理的動作,
如果單引號(quote)裡面有遇到反斜線(back slash) "\"!


下面這個例子就是用來解釋raw string,

ex4: 找到".abc"而不是"abc"
>>> string = '.abc 123 abc'
>>> pat = r"\.\w+"
>>> find(pat,string)
.abc

'\.' 的意思是 , 利用反斜線'\'是讓 '.' 原本可以代表任何字元的特殊意思被剔除,
所以'\.'代表的就是符號 點 '.'

再看看下面這個例子,

ex5:找到目錄(directory)路逕
>>> string = r'\home\python\pypyso 123455'
>>> print string
\home\python\pypyso 123455
>>> pat=r'\\\w+\\\w+\\\w+'
>>> find(pat,string)
\home\python\pypyso


'\\'兩個反斜線表示在字串之中找尋一個反斜線,

為什麼使用兩個反斜線呢? 第一個反斜線是用來拿掉反斜線的特殊意義,
所以要在字串裡找尋反斜線符號, 要有兩個反斜線(\\)








3 則留言:

  1. >>> import re
    >>> string='abc 123 cde'
    >>> par='..c'
    >>> match=re.search(pat,string)
    >>> match.group()
    'cde'

    第一個例子,我找出來的結果不一樣@@a
    抱歉,我搞不太懂怎麼一回事,只好來請教<(_._)>

    回覆刪除
  2. par = '..c'

    match=re.search(pat,string)

    what is your pat?
    >>> import re
    >>> str = 'abc 123 cde'
    >>>
    >>> pat='..c'
    >>> match=re.search(pat,str)
    >>>
    >>> match.group()

    回覆刪除
  3. 你的pattern是pat or par?

    沒有看到你的pat

    但是你的match卻 parse (pat, string) not (par, string)

    請再試試!

    回覆刪除