正規表示式是一種描述性的語言,用來匹配字串。凡是符合規則的字串,我們認為就是匹配了。
正規表示式並非python獨有的,它與語言無關。很多語言都支援正規表示式。
我們經常用正規表示式來匹配電子郵件、手機號碼、url等等。
來看乙個簡單的正規表示式,用於匹配手機號碼:
^1[35789]\d$
表示匹配以1開頭,第二位是3或5或7或8或9,後面9位是數字,且後面必須以9位數字結尾。滿足該規則的手機號就說明匹配該正則了。
python裡re
模組包含所有正規表示式的功能。
注意:由於python的字串本身也用\
轉義,所以要特別注意:
s = 'abc\\'
# 對應的正規表示式字串變成:'abc\'
使用python的r
字首,就不用考慮轉義的問題了:
s = r'abc\'
# 對應的正規表示式字串不變:'abc\'
上面的正則用python寫則是:
import re
m = re.match(r'^1[35789]\d$', '13271222223')
print(m)
m = re.match(r'^1[35789]\d$', '23271222223')
print(m)
輸出:
<_sre.sre_match object; span=(0, 11), match='13271222223'>
none
發現第二個例子匹配結果是none
。python中re
模組match()
方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none
。
所以我們可以寫如下判斷**:
import re
if re.match(r'^1[35789]\d$', '13271222223'):
print('ok')
else:
print('not match')
輸出:
ok
像\d
屬於元字元。
常用的元字元:
**說明
.匹配除換行符以外的任意字元
\w匹配字母或數字或下劃線或漢字
\s匹配任意的空白符
\d匹配數字
\b匹配單詞的開始或結束
^匹配字串的開始
$匹配字串的結束
像屬於重複限定符。
常用的限定符:
**/語法說明*
重複0次或更多次
+重複1次或更多次
?重複0次或1次
重複n次
重複n次或更多次
重複n到m次
[35789]
表示匹配3或5或7或8或9中的某乙個。像[aeiou]
就匹配任何乙個英文母音字母,[.?!]
匹配標點符號(.或?或!)。
像[0-9]
代表的含意與\d
就是完全一致的:一位數字;同理[a-z0-9a-z_]
也完全等同於\w
(如果只考慮英文的話)。
re
模組裡的split
可以代替常規的split
。示例:
# coding: utf-8
import re
string = 'abc d e'
print(string.split(' '))
print(re.split(r'\s+', string))
輸出:
['abc', 'd', '', 'e']
['abc', 'd', 'e']
我們發現常規的切分字串無法識別連續的空格,但正則可以。
正規表示式還可以提取子串。用()
表示的就是要提取的分組。
(\d\.)\d
是乙個簡單的ip位址匹配表示式。要理解這個表示式,可以按順序分析:\d
匹配1到3位的數字,(\d\.)
匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)
。
import re
m = re.match(r'(\d\.)\d', '11.22.33.44')
print(m.group(0))
print(m.group(1))
print(m.groups())
輸出:
11.22.33.44
33.('33.',)
group(0)
永遠是原始字串,group(1)
、group(2)
……表示第1、2、……個子串。groups()
返回所有子串的tuple。
這裡由於只有乙個分組,所以列印group(2)
會報錯。
當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。
比如我們要匹配數字102300後面的0
:
import re
m = re.match(r'^(\d+)(0*)$', '102300')
print(m.groups())
輸出:
('102300', '')
由於貪婪匹配,\d+
會一直匹配到末尾,把整個數字都匹配了,0*
就只能匹配空字串了。我們改改:
import re
m = re.match(r'^(\d+?)(0*)$', '102300')
print(m.groups())
輸出:
('1023', '00')
加個?
就可以讓\d+
採用非貪婪匹配。
懶惰限定符:
**/語法
說明*?
重複任意次,但盡可能少重複
+?重複1次或更多次,但盡可能少重複
??重複0次或1次,但盡可能少重複
?重複n到m次,但盡可能少重複
?重複n次以上,但盡可能少重複
參考:1、正規表示式30分鐘入門教程
Python學習 16 正規表示式
正規表示式是一種描述性的語言,用來匹配字串。凡是符合規則的字串,我們認為就是匹配了。正規表示式並非python獨有的,它與語言無關。很多語言都支援正規表示式。我們經常用正規表示式來匹配電子郵件 手機號碼 url等等。來看乙個簡單的正規表示式,用於匹配手機號碼 1 35789 d 表示匹配以1開頭,第...
Python學習 16 正規表示式
正規表示式是一種描述性的語言,用來匹配字串。凡是符合規則的字串,我們認為就是匹配了。正規表示式並非python獨有的,它與語言無關。很多語言都支援正規表示式。我們經常用正規表示式來匹配電子郵件 手機號碼 url等等。來看乙個簡單的正規表示式,用於匹配手機號碼 1 35789 d 表示匹配以1開頭,第...
Python 正規表示式學習(二)正規表示式語法
一,單一字元匹配 1 匹配任意字元 import re res re.match r a.abcd print res.group 列印結果 abc一點.表示匹配任意的字元。上面的 表示匹配a後面的任意兩個字元。必須從a開始。若寫成 b.則會發生錯誤。2 匹配指定字元 如 0 9a za z 表示 ...