正则表达式的作用:用来匹配字符串
一、字符串方法字符串提供的方法是完全匹配,不能进行模糊匹配
s = 'hello world'
#字符串提供的方法是完全匹配,不能进行模糊匹配
print(s.find('ll')) #2 查找ll的位置,输出的是第一个l的位置
ret = s.replace('ll', 'xx') #替换,用ll 替换为 xx
print(ret) #hexxo world
print(s.split('w')) #['hello ', 'orld'] 分割:以w为界限,分割为前后两部分,存在列表中
二、正则表达式正则的方法:
1、findall() :所有结果返回到一个列表里
2、search() :返回匹配到的第一个对象,对象可以调用group()返回结果
3、match() :只在字符串开始匹配,也返回一个对象,可调用group()findall() 方法:
1、正则表达式可以进行模糊匹配:
ret = re.findall(r'w\w{2}l', 'hello world') #匹配字符串中w开头l结尾中间有两个字符的词#(加r,声明是原生字符串,避免字符串转义)
print(ret) #['worl']
2、元字符
“.” 通配符:可以代指除换行符之外的所有字符,一个通配符只能代指任意一个字符
ret = re.findall('w..l', 'hello world') #匹配字符串中w开头l结尾中间有两个字符的字符串
print(ret) #['worl']
“^” 上尖角号,只在字符串开始的位置匹配匹配
ret = re.findall('^h..o', 'hjklshllo') #只在字符串的开始位置进行匹配,匹配不上就结束,不匹配后面的内容
print(ret) #[]
ret= re.findall('^h..o', 'hjkoshllo')print(ret) #['hjko']
“$”符, 只在字符串结尾匹配
ret = re.findall('h..o$', 'hjkoshllo')print(ret) #['hllo']
ret= re.findall('h..o$', 'hjkoshlyto')print(ret) #[]
“*”号,重复匹配(*还可以代指0个) ,*代指的个数是0到无穷
ret = re.findall('h.*o', 'hjkoshlytg') #*表示重复前面多个. 既只要是以h开头o结尾的都行
print(ret) #['hjko']
ret= re.findall('h*', 'hhhhjlhl') #匹配多个h
print(ret) #['hhhh', '', '', 'h', '', '']
ret= re.findall('ah*', 'sdahhh') #贪婪匹配,既按最多的匹配
print(ret) #['ahhh']
ret= re.findall('ah*?', 'sdahhh') #后加?变为惰性匹配,既按最少的匹配
print(ret) #['a']
“+”号,重复匹配,同*,但是个数最少为1个,如果是0个匹配不了,范围是1到无穷
ret = re.findall('ah+', 'asdahhhjlhl') #匹配以ah开头的内容
print(ret) #['ahhh']
ret= re.findall('a+b', 'aaabsdbhbhabj')print(ret) #['aaab', 'ab']
“?”号,匹配的范围是[0, 1]个
ret = re.findall('a?b', 'aaabsdhbhabj') #匹配[0, 1]个a
print(ret) #['ab', 'b', 'ab']
“{}”大括号,自定义匹配的次数
ret = re.findall('a{2}b', 'aaabhaabhab') #匹配2个a开头,b结尾共3位的字符
print(ret) #['aab', 'aab']
ret= re.findall('a{1,3}b', 'aaaabfaabhhab') #匹配1-3个a,以b结尾的字符#注意:{1,3} 之间不能有空格,不能写成{1, 3}
print(ret) #['aaab', 'aab', 'ab']
ret= re.findall('a{1, }b', 'aaaaaaaab') #{1,} 什么都不加默认匹配的是正无穷
print(ret) #['aaaaaaaab']
ret= re.findall('a{1,3}b', 'aaaab') #匹配1-3个a,贪婪匹配原则,既默认按多的匹配
print(ret) #['aaab']
3、字符集取消元字符的特殊功能
[]
ret = re.findall('a[dc]b', 'adb') #匹配既可以是adb也可以是acb,只能2选一,注意[]里面不用逗号隔开
print(ret) #['adb']
ret= re.findall('[a-z]', 'adb') #表示一个范围
print(ret) #'a', 'd', 'b']
[]字符集还有取消元字符的特殊功能,(\ ^ -)例外:
ret = re.findall('[w,.]', 'awdb') #.此时不是元字符,无特殊意义,而是一个普通的字符
print(ret) #['w']
ret= re.findall('[w,,]', 'awdb')print(ret) #['w']
“^”放在[]里面,表示取反:
ret = re.findall('[^w]', 'awdb') #匹配除W以外的所有字符
print(ret) #['a', 'd', 'b']
ret= re.findall('[^1,4]', 'a1wd42b') #注:取反的是(1,4) 整体
print(ret) #['a', 'w', 'd', '2', 'b']
4、\ 字符集反斜杠后跟元字符去除特殊功能;反斜杠后跟普通字符实现特殊功能"""
\d 匹配十进制数;相当于类[0-9]
\D 匹配任意非数字字符;相当于类[^0-9]
\s 匹配任意空白字符;相当于类[\t\n\r\f\v]
\S 匹配任何非空白字符;相当于类[^ \t\n\r\f\v]
\w 匹配任意字母数字字符;相当于类[a-zA-Z0-9]
\W 匹配任何人非字母数字字符;相当于类[^a-zA-Z0-9]
\b: 匹配一个特殊字符的边界,就是单词和空格间的位置
"""
ret = re.findall(r'\d{8}', 'qeqwe45454455qws1245')print(ret) #['45454455'] 只能匹配到1组,因为后面数字的不够8位
ret= re.findall(r'\d{8}', 'qeqwe45454455qws12456541')print(ret) #['45454455', '12456541'] 匹配到2组,
ret= re.findall(r'\D{4}', 'qeqwe4555qws41') #大括号里面的数字4代表的是4个字符一组
print(ret) #['qeqw']
ret= re.findall(r'\s', 'we4 g1') #匹配空白符
print(ret) #[' ']
ret= re.findall(r'\sw', 'ws4 wsg1') #匹配空白符加w
print(ret) #[' w']
ret= re.findall(r'\w', 'w4 g1') #匹配空白符
print(ret) #['w', '4', 'g', '1']
ret= re.findall(r'hello\b', 'hello, you is cat?') #匹配出你想要的且是一个单词的内容
print(ret) #['hello']
search() 方法: 匹配出第一个满足条件的结果
ret = re.search('lo', 'hello, youlo?') #匹配出你想要的且是一个单词的内容
print(ret) #<_sre.SRE_Match object; span=(3, 5), match='lo'>
print(ret.group()) #lo
ret= re.search('a.', 'asd')print(ret.group()) #as
ret= re.search(r'a\.', 'asd')# 报错,因为被索引字符串里面没有"."print(ret.group()) #AttributeError: 'NoneType' object has no attribute 'group'
ret= re.search(r'a\.', 'a.sd')print(ret.group()) #a.
ret= re.search(r'a\+', 'a+sd')print(ret.group()) #a+
ret = re.search(r'\\c', r'asd\c') #\\不加r会报错
print(ret.group()) #\c
ret= re.search(r'\\', r'asd\c') #\\不加r会报错
print(ret.group()) #\
注意:加r是告诉python解释器,\\就是原生字符,不需要转义,就直接把2个\送给re模块
ret = re.search('\\\\', r'asd\c') #等同于上面的语句,
print(ret.group()) #\c
注意:因为在python解释器里面\也是有特殊意义的,所以当传入4个\时,python解释器通过转义,变为2个\,然后传给re模块;在re模块里面,\同样是有特殊意义,所以把2个\转义为1个\,然后进行匹配
5、() :分组 |:或
ret = re.search('(as)+', r'asasd\c') #匹配括号里面一个组的字符,而不是单个字符
print(ret.group()) #asas
ret= re.findall(r'www.(\w+).com', 'www.123swd.com') #涉及到组时,只会把组里面的内容匹配出来
print(ret) #['123swd']
ret= re.findall(r'www.(?:\w+).com', 'www.123swd.com') #加问号冒号(?:)取消组的优先级
print(ret) #['www.123swd.com']
ret= re.search('(as)|', r'asd35') #匹配括号里面一个组的字符,而不是单个字符
print(ret.group()) #as
ret= re.search('(as)|3', r'asd35') #as或3,优先匹配第一个,谁在前输出谁
print(ret.group()) #as
ret= re.search('(as)|3', r'3as5e')print(ret.group()) #3
三、稍复杂一点儿的正则
ret = re.search(r'(?P\d{3})', 'asdsf124c4vss7').group('id') #给匹配到的三个数字起一个名字,叫id;?<名字>是固定写法
print(ret) #124
#后面匹配项只能是 '数字/数字或字母' 的形式,/前的一个字符一定不能为字母
ret = re.search(r'(?P\d{3})/(?P\w{3})', 'wa124/bug')print(ret.group()) #124/bug
print(ret.group('id')) #124
print(ret.group('name')) #bug
ret= re.match('asd', 'sdsasd')print(ret) #None
ret= re.split('s', 'qwesdc') #通过s对后面的字符串进行分割
print(ret) #['qwe', 'dc']
ret= re.split('[eh]', 'qwesdhtrc') #先通过e对后面的字符串进行分割,然后通过h对前面分割开的两部分继续分割
print(ret) #['qw', 'sd', 'trc']
ret= re.split('[eh]', 'hqwesdhtrc')print(ret) #['', 'qw', 'sd', 'trc'] 列表第一个元素为空,是因为字符串h前面没有其他的字符
ret= re.sub('臭猪', '小baby', '双双是臭猪') #('原内容', '新内容', '对象')
print(ret) #双双是小baby
ret= re.subn('臭猪', '小baby', '双双是臭猪,小臭猪') #('原内容', '新内容', '对象'),该方法会输出替换的次数
print(ret) #('双双是小baby,小小baby', 2)
ret= re.sub('q..s', 's..z', 'zaqwesf') #('原内容', '新内容', '操作对象')
print(ret) #zas..zf
ret= re.findall(r'\.com', 'adsdas.comasdaf')print(ret) #['.com']
obj= re.compile(r'\.com') #为了避免重复,把规则编译为一个对象,下次使用只需调用对象即可
ret = obj.findall('adsdas.comasdaf') #等价于 re.findall(r'\.com', 'adsdas.comasdaf')
print(ret) #['.com']
ret= re.finditer(r'\d', 'a2da7f') #把结果封装为一个迭代器,既此时ret为一个迭代器
print(ret) #
print(next(ret)) #<_sre.SRE_Match object; span=(1, 2), match='2'>
print(next(ret).group()) #2