正则表达式: 1.字符串模糊匹配,2.字符串有条件匹配
Re.match() 从开头开始匹配的
Re.match().group(), 得到匹配结果
Re.search() 从中间开始匹配,只匹配一次就返回
Re.findall() 找到所有的符合的条件,结果放在一个列表中
“$” 符号匹配的是 字符串最后一个字符,目标字符串是以 $前面的字符结尾
re.split() 以匹配的内容作为分割符
re.sub() 替换字符串中符合条件的匹配项
import re str = "yangguo8890long110" res = re.match("yangguod",str) #match 必须从开头开始匹配 result = res.group() #得到匹配结果 print(result) #1 '.' 默认匹配除 之外的任意一个字符,若指定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("^yangguod","yangguo8890long110") print(res2) #<_sre.SRE_Match object; span=(0, 8), match='yangguo8'> # 3'$' 匹配的目标字符串 str 必须以$前面的字符结尾,或e.search("foo$","bfoo sdfsf",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'' 匹配字符结尾,同$ # 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' 匹配空白字符、 、 、 , re.search("s+","ab c1 3").group() 结果 ' ' #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 7907") print(s)#<_sre.SRE_Match object; span=(0, 3), match='yhi'> s = re.search(".+","yhi 7907",flags= re.S) print(s)#<_sre.SRE_Match object; span=(0, 8), match='yhi 7907'>