正則表達式: 1.字符串模糊匹配,2.字符串有條件匹配
Re.match() 從開頭開始匹配的
Re.match().group(), 得到匹配結果
Re.search() 從中間開始匹配,只匹配一次就返回
Re.findall() 找到所有的符合的條件,結果放在一個列表中
“$” 符號匹配的是 字符串最后一個字符,目標字符串是以 $前面的字符結尾
re.split() 以匹配的內容作為分割符
re.sub() 替換字符串中符合條件的匹配項
import re str = "yangguo8890long110" res = re.match("yangguo\d",str) #match 必須從開頭開始匹配 result = res.group() #得到匹配結果 print(result) #1 '.' 默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 res1 = re.match("^.","yangguo8890long110") print(res1) print(res1.group()) res1 = re.match("yang.","yangguo8890long110") print("1",res1) #<_sre.SRE_Match object; span=(0, 5), match='yangg'> #2 '^' 匹配字符開頭,以某個字符開頭,可以指定flags MULTILINE, res2 = re.match("^yangguo\d","yangguo8890long110") print(res2) #<_sre.SRE_Match object; span=(0, 8), match='yangguo8'> # 3'$' 匹配的目標字符串 str 必須以$前面的字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以 res3 = re.search("l.+0$","yangguo8890long120") print("3",res3) #3 <_sre.SRE_Match object; span=(11, 18), match='long120'> res3 = re.search("l.+1$","yangguo8890long120") print("3",res3) #3 None # 4'*' 匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 結果為['abb', 'ab', 'a'] #表示*前面的b是可有可無的,但a必須存在 # 5'+' 匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb'] #表示+前面的必須以ab開頭,b可有多個 res5 = re.search("l[a-z]+g","yangguo8890longnv1208") #可以表示以某個字符結束 print(res5) #<_sre.SRE_Match object; span=(11, 15), match='long'> res5 = re.search("998.+998","yang 998guoxiao998 .s") #匹配 998中間的字符,表示以 *開頭,以* 結尾 print(res5) #<_sre.SRE_Match object; span=(5, 18), match='998guoxiao998'>
# 6'?' 匹配?前面的一個字符1次或0次 res6 = re.search("889?","yannngguang889huan") print(res6)#<_sre.SRE_Match object; span=(11, 14), match='889'> res6 = re.search("889?","yannngguang88huan")#?前面的一個字符可以不匹配 print(res6)#<_sre.SRE_Match object; span=(11, 13), match='88'> res6 = re.search("889?","yannngguang8huan") print(res6)#None
# 7'{m}' 匹配前一個字符m次 res7 = re.search("[0-9]{3}","ya4nn1n5gg6ua7ng892huan") #匹配連續的三個數字 print(res7)#<_sre.SRE_Match object; span=(16, 19), match='892'>
# 8'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] res8 = re.search("[0-9]{2,3}","ya4nn1n5gg6ua17ng892huan") #匹配連續的兩個數字或者連續的三個數字 print(res8)#<_sre.SRE_Match object; span=(13, 15), match='17'> res8 = re.findall("[0-9]{1,3}","ya4nn1n5gg6ua17ng892huan") #匹配所有的數字,最多三位 print(res8)#['4', '1', '5', '6', '17', '892']
# 9'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' res9 = re.search("123|abc","uyunjabckih123") print(res9)
# 10'(...)' 分組匹配,把括號里的字符看做一個整體,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c res10 = re.search("(123){2}.+(i){2}","yuhiinyi123123iyhii321")#匹配123 兩次 print(res10) # 11'\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 # 12'\Z' 匹配字符結尾,同$ # 13'\d' 匹配數字0-9 # 14'\D' 匹配非數字 res14 = re.search("\D+","234HKJU98+()") print(res14) #<_sre.SRE_Match object; span=(3, 7), match='HKJU'> res14 = re.findall("\D+","234HKJU98+()") print(res14)#['HKJU', '+()'] # 15'\w' 匹配[A-Za-z0-9] # 16'\W' 匹配非[A-Za-z0-9] # 17'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' #18'[a-z]' 匹配所有小寫字母一次 #19'[A-Z]' 匹配所有大寫字母一次 #20'[a-zA-Z]' 匹配所有寫字母一次,不分大小寫
2. 分組匹配,可有將匹配的字符直接轉換成字典
groupdict()方法
a = re.search("(?P<province>[0-9]{2})(?P<city>[0-9]{2})(?P<town>[0-9]{2})(?P<birthday>[0-9]{8})","511243199802241714").groupdict() print(a) #{'province': '51', 'city': '12', 'town': '43', 'birthday': '19980224'} #?P 為語法定義,P為大寫,在<>中放入字典的鍵,后面為匹配的內容
3. re.split() #以匹配的內容作為分割符,生成一個列表
s1 = re.split("[a-z]","123abc78ab9cdeg00t8") print(s1)#['123', '', '', '78', '', '9', '', '', '', '00', '8'] s2 = re.split("[a-z]+","123abc78ab9cdeg00t8") print(s2)#['123', '78', '9', '00', '8']
4.re.sub() 替換字符串中符合條件的匹配項
s3 = re.sub("[a-z]+","$","123abc78ab9cdeg00t8") #將所有字符替換成$ print(s3)#123$78$9$00$8 s4 = re.sub("[a-z]+","$","123abc78ab9cdeg00t8",count = 3) #將字符替換成$,替換3 次 print(s4)#123$78$9$00$8
5,改變匹配模式
re.I(re.IGNORECASE): 忽略大小寫
re.M(MULTILINE): 多行模式,改變'^'和'$'的行為
re.S(DOTALL): 點任意匹配模式,改變'.'的行為,可有匹配換行
# re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同) r = re.search("[a-z]+","adTYHad") print(r)#<_sre.SRE_Match object; span=(0, 2), match='ad'> rf = re.search("[a-z]+","adTYHad",flags=re.I) print(rf)#<_sre.SRE_Match object; span=(0, 7), match='adTYHad'> # re.M(MULTILINE): 多行模式,改變'^'和'$'的行為 # re.S(DOTALL): 點任意匹配模式,改變'.'的行為,可有匹配換行 s = re.search(".+","yhi\n7907") print(s)#<_sre.SRE_Match object; span=(0, 3), match='yhi'> s = re.search(".+","yhi\n7907",flags= re.S) print(s)#<_sre.SRE_Match object; span=(0, 8), match='yhi\n7907'>