什麼是正則表達式?正則表達式
正則表達式是一個特殊的字符序列,它可以幫助你方便的檢查一個字符串是否可以與某種模式匹配。spa
re的匹配語法有如下幾種code
一、re.match 從頭開始匹配 注:只有第一個字符匹配纔會返回值,若是第一個字符不匹配則返回Noneblog
二、re.search 匹配包含(全局匹配) 注:當存在多個匹配到的字符時,只返回第一個。例如:s = 'ad1jkn3nj' re.search('[0-9]', s) 返回<re.Match object; span=(2, 3), match='1'>內存
三、re.findall 把全部匹配到的字符放到以列表中的元素返回ci
四、re.split 以匹配到的字符看成列表分隔符,(注:maxsplit爲替換次數)字符串
1 import re 2 s = '31-213*312/1321+1321' 3 print(re.split("[-*/+]", s, maxsplit=2)) # 以-*/+分割數字;[]是包含的意思 結果 ['31', '213', '312/1321+1321']
五、re.sub 匹配字符並替換(注:count爲替換次數)it
1 import re 2 s = 'dsa\dsakl1321aa|d21321darewr$d1321afds' 3 print(re.sub('\d+', "=", s, count=2)) # 把數字替換成"=" 結果 dsa\dsakl=aa|d=darewr$d1321afds
六、re.fullmatch 所有匹配;整個字符串所有匹配成功就返回re object,不然返回None 例如:re.fullmatch('ads', 'asd') 返回re objectclass
七、re.compile 與re.fullmatch 相似。速度相對re.fullmatch 快一點。(先存儲到內存裏而後直接調用,re.fullmatch的話每次都要匹配,影響效率)test
1 import re 2 pattern = re.compile("\\w+@\\w+\\.(com|cn|edu)") 3 result = pattern.fullmatch('kevin@cnblogs.com') 4 print(result)print(result) # 結果<re.Match object; span=(0, 17), match='kevin@cnblogs.com'>
經常使用的表達式規則
'.' 默認匹配除\n以外的任何一個字符,例如:re.search('.', 'abca') 結果 <re.Match object; span=(0, 1), match='a'> 注:當'..'時,返回ab,若指定flag DOTALL,則匹配任意字符,包括換行。
'^' 匹配字符開頭,例如:re.search('^ab', 'abca') 結果 <re.Match object; span=(0, 1), match='ab'> ,若指定flags MULTILINE,這種也能夠匹配上(r''^a'', ''\nabc\neee'', flags=re.MULTILINE)
'$' 匹配字符結尾,例如:re.search('b$', 'ab') 結果 <re.Match object; span=(0, 1), match='b'> ,若指定flags MULTILINE,re.search('foo.$', 'foo1\nfoo2\n', re.MULTILINE).group() 會匹配到foo1
'*' 匹配*號前的字符0次或屢次,re.search('a*' , 'aaabhdjhbas') 結果'aaa'
'+' 匹配前一個字符1次或屢次,re.findall('ab+', 'ab+cd+abb+bba') 結果['ab', 'abb']
'?' 匹配前一個字符1次或0次,re.search('b?', 'bkevinb').group() 匹配到第一個b,當第一個字符不是b時匹配爲0次
'{m}' 匹配前一個字符m次(注:匹配的字符必須連在一塊兒),re.search('b{3}', 'kevinbbbb6').group() 匹配到 'bbb'
'{n, m}' 匹配前一個字符n到m次,re.findall('ab{1,3}', "abb abcabbcbbb") 結果['abb', 'ab', 'abb']
'|' 匹配|左或|右的字符(注:當兩個都存在時,現匹配到那個輸出那個),re.search("abc|ABC", "ABCBabcADSA").group() 結果 ABC。re.search("[a|A]BC", "aBCADSA").group() 結果 aBC
'(...)' 分組匹配,re.search("(abc){2}a(123|45)", "abcabca123qeq").groups() 結果('abc', '123'),例如:re.search("([a-z]+)([0-9]+)", "kevin1231").groups()) 結果 ('kevin', '1231')
'\A' 只從字符開頭匹配,re.search("\Aabc", "kevinabc") 返回None是匹配不到的 同'^'
‘[]’ 匹配範圍(從開頭開始匹配),re.search("([a-z]+)([0-9]+)", "kevin1231").groups() 結果 ('kevin', '1231')
'\Z' 匹配字符結尾,同$
'\d' 匹配數字0-9
'\D' 匹配非數字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r,re.findall('\s+', "ab\tdsa\nsdsa\r") 結果['\t', '\n', '\r']
'(?P<name>...)' 分組匹配s = '1366597199609090054' 方法一:re.search("(?P<province>\d{3})(?P<city>\d{3})(?P<year>\d{4})", s) .groups() 結果('136', '659', '7199')
方法二:res = re.search("(?P<province>\d{3})(?P<city>\d{3})(?P<year>\d{4})", s)
res.groupdict() 結果{'province': '136', 'city': '659', 'year': '7199'}
轉義
當要以'|'分割時要轉義寫爲'\|" 當s中存在"\"時,系統會自動生成"\\"因此轉義時要寫成"\\\"
import re s = 'dsa\dsakl1321aa|ddarewr$d1321afds' print(re.split("\\\|\d+|\||\$", s))
結果 ['dsa', 'dsakl', 'aa', 'ddarewr', 'd', 'afds']
Flags標誌符
一、re.I(re.IGNORECASE):忽略大小寫(括號內是完整寫法,下同)例如: re.search('k', 'Kevin', re.I) 結果 <re.Match object; span=(0, 1), match='K'>
二、M(MULTILINE): 多行模式,改變'^'和'$',的行爲 例如:re.search('foo.$', 'foo1\nfoo2\n', re.MULTILINE).group() 會匹配到foo1
三、S(DOTALL): 改變'.'的行爲 例如:re.search('.', '\n', re.S) 結果 \n 若是不re.S的話則顯示None
四、X(re.VERBOSE) 能夠給你的表達式寫註釋,使其更可讀。
例如:
import re s = '31-213*312/1321+1321' print(re.split("[-*/+] # test", s,re.X,))