在上一個篇幅裡, 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
'\\'兩個反斜線表示在字串之中找尋一個反斜線,
為什麼使用兩個反斜線呢? 第一個反斜線是用來拿掉反斜線的特殊意義,
所以要在字串裡找尋反斜線符號, 要有兩個反斜線(\\)