目錄
python 正規表示式
正規表示式基本知識
re模組
匹配字串
切分字串 分組
貪婪匹配 編譯
\d表示匹配乙個數字,即0-9
\w表示匹配乙個字母或數字
.表示匹配任意乙個字元
*表示匹配任意個字元(包括0個),或其前面的表示式出現任意次數
+表示至少匹配乙個字元,或其前面的表示式至少出現1次
?表示匹配0個或1個字元,或其前面的表示式出現0次或1次
表示其前面的表示式至少出現n次
表示其前面的表示式出現n到m次
\s表示匹配任意空白字元
[...]
表示匹配集合中的乙個字元
^表示匹配字串的開頭。例如'^\d'表示必須以數字開頭
$表示匹配字串的結尾。例如\d$''表示必須以數字結尾
|表示匹配左右兩邊其中乙個字元。例如a|b表示匹配a或者b
例子:\d\s+\d
從左到右解讀一下:
\d
表示匹配3個數字,例如'010'
;
\s
可以匹配乙個空格(也包括tab等空白符),所以\s+
表示至少有乙個空格,例如匹配' '
,' '
等;
\d
表示匹配3-8個數字,例如'1234567'
。
綜合起來,上面的正規表示式可以匹配以任意個空格隔開的帶區號的**號碼。
要做更精確地匹配,可以用表示範圍,比如:
python提供re模組,包含所有正規表示式的功能.。
由於python的字串本身也用\
轉義,而正規表示式本身就是乙個字串,所以為了方便,建議使用python的r字首表示原始字串,這樣就不用考慮轉義的問題。
>>> import re
>>> re.match(r'^\d\-\d$', '010-12345')
<_sre.sre_match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d\-\d$', '010 12345')
>>>
match()方法判斷是否匹配,如果匹配成功,返回乙個match
物件,否則返回none
。常見的判斷方法就是:
test = '使用者輸入的字串'
if re.match(r'正規表示式', test):
print('ok')
else:
print('failed')
用正規表示式切分字串比用固定的字元更靈活,請看正常的切分**:
>>> 'a b c'.split(' ')
['a', 'b', '', '', 'c']
嗯,無法識別連續的空格,用正規表示式試試:
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
無論多少個空格都可以正常分割。加入,
試試:
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
再加入;試試:
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
除了簡單地判斷是否匹配之外,正規表示式還有提取子串的強大功能。用()
表示的就是要提取的分組(group)。比如:
^(\d)-(\d)$
分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:
>>> m = re.match(r'^(\d)-(\d)$', '010-12345')
>>> m
<_sre.sre_match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
如果正規表示式中定義了組,就可以在match
物件上用group()
方法提取出子串來。
注意到group(0)
永遠是原始字串,group(1)
、group(2)
……表示第1、2、……個子串。
最後需要特別指出的是,正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元。舉例如下,匹配出數字後面的0
:
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由於\d+
採用貪婪匹配,直接把後面的0
全部匹配了,結果0*
只能匹配空字串了。
必須讓\d+
採用非貪婪匹配(也就是盡可能少匹配),才能把後面的0
匹配出來,加個?
就可以讓\d+
採用非貪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
當我們在python中使用正規表示式時,re模組內部會幹兩件事情:
編譯正規表示式,如果正規表示式的字串本身不合法,會報錯;
用編譯後的正規表示式去匹配字串。
如果乙個正規表示式要重複使用幾千次,出於效率的考慮,我們可以預編譯該正規表示式,接下來重複使用時就不需要編譯這個步驟了,直接匹配:
>>> import re
# 編譯:
>>> re_telephone = re.compile(r'^(\d)-(\d)$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
編譯後生成regular expression物件,由於該物件自己包含了正規表示式,所以呼叫對應的方法時不用給出正則字串。 python3正規表示式
正規表示式,又稱規則表示式。英語 regular expression,在 中常簡寫為regex regexp或re 電腦科學的乙個概念。正規表示式通常被用來檢索 替換那些符合某個模式 規則 的文字。正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 及這些特定字元的組合,組成乙個...
Python3 正規表示式
常用的匹配模式 正規表示式是乙個特殊的字串行,它能幫助你方便的檢查乙個字串是否與某種模式匹配。re 模組使 python 語言擁有全部的正規表示式功能。re.match函式 re.match 嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match 就返回none。re.match...
Python3 正規表示式
正規表示式是乙個特殊的字串行,它能幫助你方便的檢查乙個字串是否與某種模式匹配。python 自1.5版本起增加了re 模組,它提供 perl 風格的正規表示式模式。re 模組使 python 語言擁有全部的正規表示式功能。compile 函式根據乙個模式字串和可選的標誌引數生成乙個正規表示式物件。該...