正則表達式(Regular Expression)用於描述一種字符串匹配的模式,它可用於檢查一個字符串是否含有某個子串,也可用於從字符串中提取匹配的子串,或者對字符串中匹配的子串執行替換操做。python
這個模塊提供了與 Perl 語言相似的正則表達式匹配操做。正則表達式
re.I(re.IGNORECASE): 忽略大小寫
re.M(MULTILINE): 多行模式,改變‘^’和’$’的行爲
re.S(DOTALL): 使'.'匹配包括換行在內的全部字符
re.X(re.VERBOSE) 能夠給你的表達式寫註釋,使其更可讀函數
'.' 默認匹配除\n以外的任意一個字符,若指定flag DOTALL或S,則匹配任意字符,包括換行spa
res = re.search('.', 'abcd') res2 = re.search('.', '\nabcd', re.DOTALL) print(res) print(res2) ''' <re.Match object; span=(0, 1), match='a'> <re.Match object; span=(0, 1), match='\n'> '''
[] 匹配[]中列舉的字符code
res = re.search('[0-9]', 'lkso092') print(res) ''' <re.Match object; span=(4, 5), match='0'> '''
'\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的,至關於re.match('abc',"alexabc") 或^對象
res = re.search('\Aabc', 'vivianabc') res1 = re.search('^abc', 'abcvivian') res2 = re.match('abc', 'abcvivian') print(res) print(res1) print(res2) ''' None <re.Match object; span=(0, 3), match='abc'> <re.Match object; span=(0, 3), match='abc'> '''
'\Z' 匹配字符結尾,同$字符串
res = re.search('ac\Z', 'abcacac') print(res) ''' <re.Match object; span=(5, 7), match='ac'> '''
'\d' 匹配數字0-9string
res = re.search('\d', 'kji980') print(res) ''' <re.Match object; span=(3, 4), match='9'> '''
'\D' 匹配非數字it
'\w' 匹配[A-Za-z0-9]io
'\W' 匹配非[A-Za-z0-9]
'* ' 對它前面的正則式匹配0到任意次重複, 儘可能多的匹配字符串。 ab* 會匹配 'a', 'ab', 或者 'a'後面跟隨任意個'b'。 re.search('a*','aaaabac') 結果'aaaa';
'+' 對它前面的正則式匹配1到任意次重複,ab+ 會匹配 'a' 後面跟隨1個以上到任意個 'b',它不會匹配 'a'。re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
'?' 對它前面的正則式匹配0到1次重複。 ab? 會匹配 'a' 或者 'ab' 。re.search('b?','alex').group() 匹配b 0次
'{m}' 對其以前的正則式指定匹配 m 個重複;少於 m 的話就會致使匹配失敗。好比,a{6} 將匹配6個 'a' , 可是不能是5個 。re.search('b{3}','alexbbbs').group() 匹配到'bbb'
'{m,n}' 對正則式進行 m 到 n 次匹配,在 m 和 n 之間取儘可能多。 好比,a{3,5} 將匹配 3 到 5個 'a'。忽略 m 意爲指定下界爲0,忽略 n 指定上界爲無限次。 好比 a{4,}b 將匹配 'aaaab' 或者1000個 'a' 尾隨一個 'b',但不能匹配 'aaab'。逗號不能省略,不然沒法辨別修飾符應該忽略哪一個邊界。re.findall("ab{1,3}","abb abc abbcbbb") 結果['abb', 'ab', 'abb']
'^' 匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符串尾或者換行符的前一個字符,在 MULTILINE 模式匹配換行符的前一個字符。在 'foo1\nfoo2\n' 搜索 foo.$ ,一般匹配 'foo2' ,但在 MULTILINE 模式 ,能夠匹配到 'foo1' 。即若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 會匹配到foo1
'|' 匹配|左或|右的正則表達式,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
'(...)' 分組匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 結果爲'abcabca45'
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
'(?P...)' 分組匹配 (?P
res1 = re.search(r'(?P<group1>\d{3})(?P<group2>[a-z]{3})(?P<group3>[A-Z]{3})', '123123aksEDWDSX') res2 = re.search(r'(?P<group1>\d{3})(?P<group2>[a-z]{3})(?P<group3>[A-Z]{3})', '123123aaaaksEDWDSX') print(res1.groupdict()) # {'group1': '123', 'group2': 'aks', 'group3': 'EDW'} print(res2.groupdict()) # AttributeError: 'NoneType' object has no attribute 'groupdict'
re.match 嘗試從字符串的起始位置匹配一個模式,若是不是起始位置匹配成功的話,match()就返回none。
函數語法:
re.match(pattern, string, flags=0)
函數參數說明:
參數 描述
pattern 匹配的正則表達式
string 要匹配的字符串。
flags 標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
匹配成功re.match方法返回一個匹配的對象,不然返回None。
咱們可使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') print(m.group(0)) print(m.group(1)) print(m.group(2)) print(m.groups()) # 010-12345 # 010 # 12345 # ('010', '12345')
若是正則表達式中定義了組,就能夠在Match對象上用group()方法提取出子串來。
注意到group(0)永遠是原始字符串,group(1)、group(2)……表示第一、二、……個子串。
search 函數和 match 函數是相似的,區別在於match方法是隻在目標函數開頭匹配一次;search函數是在整個目標函數上匹配一次,一次匹配成功後再也不進行匹配。
一樣search方法返回的也是一個match對象,用法和match方法返回的結果同樣。
print(re.search('www', 'www.runoob.com').group()) print(re.search('com', 'www.runoob.com').group()) # www # com
在字符串中找到正則表達式所匹配的全部子串,並返回一個列表,若是沒有找到匹配的,則返回空列表。
注意 match 和 search 是匹配一次,findall 匹配全部。
函數語法:
findall(string[, pos[, endpos]])
參數:
string : 待匹配的字符串。
pos : 可選參數,指定字符串的起始位置,默認爲 0。
endpos : 可選參數,指定字符串的結束位置,默認爲字符串的長度。
# 查找字符串中的全部數字 print(re.findall('[0-9]', 'asodi92kjsdc980')) # ['9', '2', '9', '8', '0']
split 方法按照可以匹配的子串將字符串分割後返回列表.
函數語法:
re.split(pattern, string[, maxsplit=0, flags=0])
參數:
參數 描述
pattern 匹配的正則表達式
string 要匹配的字符串。
maxsplit 分隔次數,maxsplit=1 分隔一次,默認爲 0,不限制次數。
flags 標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
s = '9-2*5/3+7/3*99/4*2998+10*568/14' print(re.split(r"[\*\-\/\+]", s)) # ['9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14']
Python 的 re 模塊提供了re.sub用於替換字符串中的匹配項。
函數語法:
re.sub(pattern, repl, string, count=0, flags=0)
參數:
pattern : 正則中的模式字符串。
repl : 替換的字符串,也可爲一個函數。
string : 要被查找替換的原始字符串。
count : 模式匹配後替換的最大次數,默認 0 表示替換全部的匹配。
phone = "2004-959-559 # 這是一個國外電話號碼" # 刪除字符串中的 Python註釋 num = re.sub(r'#.*$', "", phone) print("電話號碼是: ", num) # 刪除非數字(-)的字符串 num = re.sub(r'\D', "", phone) print("電話號碼是: ", num) ''' 電話號碼是: 2004-959-559 電話號碼是: 2004959559 '''
review:
'* ' 對它前面的正則式匹配0到任意次重複, 儘可能多的匹配字符串。
'$' 匹配字符串尾或者換行符的前一個字符。
compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數使用。
函數語法:
re.compile(pattern[, flags])
參數:
pattern : 一個字符串形式的正則表達式
flags : 可選,表示匹配模式,好比忽略大小寫,多行模式等
pattern = re.compile(r'[0-9]+') # 用於匹配至少一個數字 print(pattern.match('one1twe2')) # 查找頭部,沒有匹配 # None
m = re.compile(r'\d+') print(m.match('one1twe2', 3, 7)) # 從1位置開始匹配,正好匹配 # <re.Match object; span=(3, 4), match='1'>