import re正則表達式
注:爲.py文件取名時不能與模塊的名字相同spa
匹配全部條件相匹配,每一項都是列表中的元素code
import re ret = re.findall(r"\d+", "大123家78好!") print(ret) 運行結果: ['123', '78']
匹配從左到右的第一個結果,獲得的是一個變量,經過這個變量的group()方法來獲結果blog
ret = re.search(r"\d+", "大123家78好!") print(ret) print(ret.group()) 運行結果: <_sre.SRE_Match object; span=(1, 4), match='123'> 123
須要注意的是如果沒有匹配結果,就會報錯,所以經常使用if作判斷,再進行打印內存
ret = re.search(r"\d+", "大123家78好!") if ret: print(ret.group())
從頭開始匹配,至關於search的正則表達式的開頭加入 ^ 規則rem
ret = re.match(r"\d+", "大123家78好!") print(ret) ret = re.match(r"\d+", "123家78好!") print(ret) print(ret.group()) 運行結果: None <_sre.SRE_Match object; span=(0, 3), match='123'> 123
與字符串的切割相似,切割條件去除,且以切割條件結尾的話會,結果中會出現一個空(" ")字符串
ret = re.split(r"\d+", "大123家78好!") print(ret) ret = re.split(r"\d+", "大123家78好!9") print(ret) 運行結果: ['大', '家', '好!'] ['大', '家', '好!', '']
sub與subnit
sub("正則a","b","內容",n)編譯
subn("正則a","b","內容")class
sub與subn幾乎相同,只是subn能夠現出替換的次數,
用法是:將規則a的匹配內容換成b,n是想要替換的次數
ret = re.sub(r"\d+", "!", "大123家78好") print(ret) ret = re.subn(r"\d+", "!", "大123家78好") print(ret) ret = re.sub(r"\d+", "!", "大123家78好", 1) print(ret) 運行結果: 大!家!好 ('大!家!好', 2) 大!家78好
compile能夠節省使用正則表達式解決問題的時間,她是將正則表達式編譯成字節碼,這樣在屢次使用時就不須要屢次編譯了.
ret = re.compile(r"\d+") print(ret) print(ret.findall("大123家78好!")) print(ret.search("大123家78好!").group()) 運行結果: re.compile('\\d+') ['123', '78'] 123
能夠節省使用正則表達式時所佔用的內存
finditer返回一個迭代器,全部的結果都在這個迭代器中,須要經過循環+group的形式取值所以可以節省內存
ret = re.finditer(r"\d+", "大123家78好!") print(ret) for i in ret: print(i.group()) 運行結果: <callable_iterator object at 0x000000000256EFD0> 123 78
findall爲了能夠順利取到分組中的內容,有一個特殊的語法,就是優先顯示分組中的內容
s = '<a>wahaha</a>' ret = re.findall(r">\w+<", s) print(ret) ret = re.findall(r">(\w+)<", s) print(ret) 運行結果: ['>wahaha<'] ['wahaha']
?:正則表達式能夠取消分組優先
ret = re.findall(r"\d(.\d+)?", "1.23*4") print(ret) ret = re.findall(r"\d(?:.\d+)?", "1.23*4") print(ret) 運行結果: ['.23', ''] ['1.23', '4']
group()中數字參數表明的是取對應分組中的內容,不加參數默認爲0表明的是所有匹配的內容
s = '<a>wahaha</a>' set = re.search(r"<(\w+)>"r"(\w+)"r"</(\w+)>", s) print(set.group()) print(set.group(0)) print(set.group(1)) print(set.group(2)) print(set.group(3)) 運行結果: <a>wahaha</a> <a>wahaha</a> a wahaha a
split應用分組時會保留切割條件
ret = re.split('\d+', 'alex83taibai40egon25aa') print(ret) ret = re.split('(\d+)', 'alex83taibai40egon25aa') print(ret) 運行結果: ['alex', 'taibai', 'egon', 'aa'] ['alex', '83', 'taibai', '40', 'egon', '25', 'aa']
?P<這個組的名字>正則表達式
s = '<a>wahaha</a>' ret = re.search('>(?P<con>\w+)<', s) print(ret.group(1)) print(ret.group('con')) 運行結果: wahaha wahaha
判斷標籤的頭尾是否一致
s = '<a>wahaha</a>' pattern = '<(\w+)>(\w+)</(\w+)>' ret = re.search(pattern, s) print(ret.group(1) == ret.group(3)) # 使用前面的分組 要求使用這個名字的分組和前面同名分組中的內容匹配的必須一致 pattern_new = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' ret = re.search(pattern_new, s) print(ret) 運行結果: True <_sre.SRE_Match object; span=(0, 13), match='<a>wahaha</a>'>
當所取的內容沒有太大的區分特色時容易和你不想匹配的內容混在一塊兒,可使用分組的優先取值
ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) ret = re.findall(r"\d+\.\d+|(\d+)", "1-2*(60+(-40.35/5)-(-4*3))") ret.remove('') print(ret) 運行結果: ['1', '2', '60', '40', '35', '5', '4', '3'] ['1', '2', '60', '5', '4', '3']