1. 程式人生 > >Python學習 :正則表示式

Python學習 :正則表示式

正則表示式

python 使用正則表示式(re)來進行匹配引擎搜尋

正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”

 

關於正則表示式,必須先學會它的元字元

元字元 : ^  $  *  +  ?  { }  [ ]  |  ( )  \

.  匹配除\n(換行符)以外的任何字元,若指定flag DOTALL,則匹配任意字元,包括換行

s = re.findall('b...u', 'www.baidu.com www')
>>> ['baidu']

 

^  匹配字元開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

s = re.findall('^w.w', 'www.baidu.com wWw')
>>> ['www']

 

$  匹配字元結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以

s = re.findall('w.w$', 'www.baidu.com wWw')
>>> ['wWw']

 

*  匹配*號前的字元0次或多次

s = re.findall('abc*', 'abccccccc')
>>> ['abcccccc']
s = re.findall('abc*', 'ab')
>>> ['ab']

 

+   匹配前一個字元1次或多次

s = re.findall('abc+', 'abccccccc')
>>> ['abcccccc']

 

?   匹配前一個字元1次或0次

s = re.findall('abc?', 'abccccccc')
>>> ['abc']

 

{n}  匹配前一個字元n次,即前一個字元至少出現n次

s = re.findall('abc{2}', 'abccccccc')
>>> ['abcc']

 

{n,m}  匹配前一個字元n到m次

s = re.findall('abc{2,3}', 'abccccccc')
>>> ['abccc']

 

|  匹配|左或|右的字元

s = re.findall('abc|ABC', 'abcABC')
>>> ['abc', 'ABC']

 

()   提取括號中的內容

s = re.findall('(bai)', 'www.baidu.com')
>>> ['bai']

 

[ ] 字符集:1、[ab] 取a或b 2、字符集裡的符號沒有特殊的意義 3、尖角號^取反 4、選擇出某種元素

# 1、[] 裡面的元素取其一
s = re.findall('[aid]', 'www.baidu.com')
>>>['a', 'i','d']
# 2、消除符號的特殊意義
s = re.findall('[*]', 'abccccccc*')
>>>['*']
# 3、取反
s = re.findall('[^abc]', 'abcABC')
>>>['A', 'B', 'C']
# 4、選擇元素(數字或字母)
s = re.findall('[a-z]', 'ab123c41d2ABeC')
>>>['a', 'b', 'c', 'd', 'e']

 

\   反斜槓後邊跟元字元去除特殊功能,反斜槓後邊跟普通字元實現特殊功能

 

通用字元

\A    只從字元開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
\Z    匹配字元結尾,同$
\D    匹配非數字
\S    匹配任何非空白字元
\W    匹配非[A-Za-z0-9]
\d    匹配數字0-9,十進位制數字
\w    匹配[A-Za-z0-9],匹配任一字母、數字、下劃線
\s    匹配空白字元、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'

 

模式修正符,一般放在最後位置

I  re.I   不區分大小寫

M re.M 多行匹配,改變'^'和'$'的行為

S re.S  點任意匹配模式,改變'.'的行為

 

常用的匹配語法

re.findall()  # 完全匹配,把所有匹配到的字元放到以列表中的元素返回
re.findall('com','www.baidu.com map.baidu.com')
>>> ['com', 'com']

re.match()    # 從頭開始匹配
re.match('com','www.baidu.com map.baidu.com')
>>> None

re.search()   # 搜尋匹配,僅返回一個結果;通過呼叫group()方法得到匹配的字串,如果字串沒有匹配,則返回None。
re.search('com','www.baidu.com map.baidu.com').group()
>>> com

re.split()    # 按照能夠匹配的子串將字串分割後返回列表。maxsplit用於指定最大分割次數,不指定使用預設值0將全部分割
re.split('\d','www.1baidu2.3com',2) # 預設為0,即全部分隔;指定次數後只分隔兩次
>>> ['www.', 'baidu', '.3com']
re.split(' ','www.baidu.com map.baidu.com') # 分隔空格
>>> ['www.baidu.com', 'map.baidu.com']

re.sub()      # 匹配字元並進行替換
re.sub('\d','ai','www.b1du.com ',1) # 替換一次
>>> www.baidu.com
re.subn()     # 與 sub 函式完全一致,只不過其返回值是包括兩個元素的元組:(new_string, number);第一個返回值 new_string 為sub 函式的結果,第二個 number 為匹配及替換的次數。
ret=re.subn('\d','ai','www.b1du.com map.b2du.com',2) # 替換兩次
>>> ('www.baidu.com map.baidu.com', 2)

 

re 模組的兩種匹配模式

貪婪模式:儘可能多的去匹配

惰性模式:儘可能少的去匹配(後面加?號來限制)