正則表達式對於初學者來說,要用好這個功能還是有點難度,也看了好久書加練習才掌握一些基礎。對學到的一些東西還是寫下來比較好一些,免得過幾天又忘了。
常用符號:. * ? ()
常用方法: findall search sub
常用技巧
1 Python 正則式的基本用法
Python 通過標准庫re模塊支持正則表達式。
>>> import re
>>> string = "XXXIXXXLoveXXX"
>>> re.findall('XXX(.*?)XXX', string)
['I']
>>>
在python術語中,有兩種主要方法完成模式匹配:serarching 和matching.
搜索:在字符串中任意部分中搜索匹配模式。
匹配:判斷一個字符串是否能從起始位置全部或部分匹配某個模式。
常用正則符號字符如下圖:
a. 基本規則
'.' 匹配所有字符
匹配除換行符 '\n' 外的所有字符。如果使用了 'S' 選項,匹配包括 '\n' 的所有字符。要明確的匹配一個'.',必須使用’\‘對它進行轉義。
>>> s = """XXX
IXXX"""
>>> re.findall('.+', s)
['XXX', 'IXXX']
>>> re.findall('.+', s, re.S)
['XXX\nIXXX']
>>>
b. 對基本規則作限定(閉包操作符)
'*' 0 或多次匹配。常用.*(貪心算法)
>>> x = "abc2323sf23"
>>> re.findall('c.*s', x)
['c2323s']
>>>
'+' 1 次或多次匹配
>>> x = "abc2323sf23"
>>> re.findall('c\d+s', x)
['c2323s']
>>>
'?' 0 或 1 次匹配。常用.*?(非談心算法)
>>> x = "abc2323sf23"
>>> re.findall('c\d?', x)
['c2']
>>> re.findall('c\d+?', x)
['c2']
>>> re.findall('c.*?', x)
['c']
‘{m}'精確匹配 m 次
‘{m,n}'匹配最少 m 次,最多 n 次
2. ()創建組
一對()和正則表達式一起使用可達到:
a. 對正則進行分組
b. 匹配子組
>>> s= 'XXXIXXXLOVEXXXYOU'
>>> re.findall('XXX(.*)XXX(.*)XXX(.*)', s)
[('I', 'LOVE', 'YOU')]
>>>
可以看到 findall 函數只返回了包含在 ’()’ 中的內容,而雖然前面和後面的內容都匹配成功了,卻並不包含在結果中。
3. 常用函數
findall(pattern, string[,flags])
在目標字符串中查找符合規則的字符串。
第一個參數是規則,第二個參數是目標字符串,後面還可以跟一個規則選項。
返回結果結果是一個列表, 中間存放的是符合規則的字符串。如果沒有符合規則的字符串被找到,就返回一個空列表。
常用規則選項
I IGNORECASE 忽略大小寫區別。
L LOCAL 字符集本地化。這個功能是為了支持多語言版本的字符集使用環境的,比如在轉義符/w ,在英文環境下,它代表[a-zA-Z0-9] ,即所以英文字符和數字。如果在一個法語環境下使用,缺省設置下,不能匹配 "é" 或 "ç" 。 加上這 L 選項和就可以匹配了。不過這個對於中文環境似乎沒有什麼用,它仍然不能匹配中文字符。
M MULTILINE 多行匹配。在這個模式下 ’^’( 代表字符串開頭 ) 和 ’$’( 代表字符串結尾 ) 將能夠匹配多行的情況,成為行首和行尾標記。
當我們調用findall()方法,我們可以非常簡單的得到一個所有匹配模式的 列表,而不是得到對象。
>>> string = 'bird cat bird, cat dog'
>>> s = re.findall(r'cat', string)
>>> s
['cat', 'cat']
>>>
match 與 search
match( pattern, string, flags = 0)
search( pattern, string, flags = 0)
match函數嘗試從字符串的開頭開始對模式進行匹配,如果匹配成功,就返回一個匹配對象,如果失敗返回空,匹配對象的group()方法可以用來顯示那個成功的匹配。
search函數工作方式和match一樣,這兩個函數唯一的區別是: match 從字符串的開頭開始匹配,如果開頭位置沒有匹配成功,就算失敗了;而 search 會跳過開頭,繼續向後尋找是否有匹配的字符串。
常見例子:
對字符串'bird cat bird'調用mathch()方法,查找模式'bird'將會匹配:
>>> re.match(r'bird', 'cat bird cat')
>>> string = 'bird cat bird'
>>> s = re.match(r'bird', string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
'bird'
>>> s = re.match(r'cat', string)
>>> s
>>>
但是,如果我們對同一個字符串調用math()方法,查找模式'cat',則不會找到匹配。
而search()結果則不一樣,search()方法會在它查找到一個匹配項之後停止繼續查找,並返回其首次出現的位置。
>>> string = 'bird cat bird'
>>> s = re.search(r'cat', string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
'cat'
>>>
分組示例:
即:上面提到的'()'號,對整個正則表達式的特定子串進行定位的能力。我們可以定義一個分組做為整個正則表達式的一部分,然後單獨的對這部分對應匹配到的內容定位。
>>> string = "name: Tom, phone: 12344"
>>> s = re.findall(r'(.*): (.*), phone: (\d+)',string)
>>> s
[('name', 'Tom', '12344')]
>>> s = re.search(r'(.*): (.*), phone: (\d+)',string)
>>> s
<_sre.SRE_Match object at 0x0000000002F54AE0>
>>> s.group(1)
'name'
>>> s.group(2)
'Tom'
>>> s.group(3)
'12344'
>>>
通過用圓括號來(字符‘(’和‘)’)包圍正則表達式的特定部分,可以對內容進行分組然後對這些子組做單獨處理。
下面關於Python的文章您也可能喜歡,不妨看看:
CentOS 7安裝Python3.5 http://www.linuxidc.com/Linux/2016-04/129784.htm
Linux下Python的安裝以及注意事項 http://www.linuxidc.com/Linux/2015-11/124861.htm
Ubuntu 14.04 下安裝使用Python rq模塊 http://www.linuxidc.com/Linux/2015-08/122441.htm
無需操作系統直接運行 Python 代碼 http://www.linuxidc.com/Linux/2015-05/117357.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡