(六)正则表达式
1、正则表达式基础语法
python的re模块支持正则表达式符号。
正则表达式目的就是验证、匹配、查找字符串。
“”"
正则表达式
模块是re
re.match(正则,字符串) 必须掌握
从左往右匹配,如果匹配不成功返回None
如果匹配成功,返回一个Match对象,使用group()方法获取匹配字符串
re.search搜索全部,找第一个匹配的,返回一个Match对象或None
re.findall找所有符合的,结果是列表
re.finditer找所有符合的,结果是迭代器
re.sub替换
re.DOTALL让.支持换行符
re.I忽略大小写
re.ASCII让\w只支持英文字母、数字、下划线
“”"
#导入模块
import re
#.表示任何一个字符,默认换行除外
ret = re.match(r'.', 'hello,laowang')
print(ret)
print(ret.group())
#默认不支持换行符
ret = re.match(r'.', '\nhello,laowang')
print(ret)
让.支持换行符
ret = re.match(r'.', '\nhello,laowang', re.DOTALL)
print(ret)
/d匹配一个数字
ret = re.match(r'\d', '123abc')
print(ret)
#/D匹配一个非数字
ret = re.match(r'\D', 'abc123')
print(ret)
/w匹配一个文字、数字、下划线
ret = re.match(r'\w', 'laowang')
print(ret)
ret = re.match(r'\w', '老王',re.ASCII)
print(ret)
ret = re.match(r'\w', 'laowang',re.ASCII)
print(ret)
print('*'*100)
ret = re.match(r'\w', ',laowang')
print(ret)
#[]匹配范围内的一个
ret = re.match(r'[0-9]', '123abc')
print(ret)
ret = re.match(r'[a-z,.A-Z0-9]', '.Abc')
print(ret)
ret = re.match(r'[a-z]', 'Abc',re.I)
print(ret)
|或者
ret = re.match(r'\d|[a-z]', '123abc')
print(ret)
()改变或者 分组
ret = re.match(r'ab(c|ba)', 'abba123')
print(ret)
ret = re.match(r'[a-z]+', '0abc123')
print(ret)
+至少1个
ret = re.findall(r'[a-z]+\d+', '0abc123hello345')
print(ret)
#{3}表示3个
ret = re.search(r'\d{3}-\d{8}', 'xxx...020-99999999')
print(ret)
ret = re.findall(r'\d{3}-\d{8}', '020-88888888...020-99999999')
print(ret)
ret = re.finditer(r'\d{3}-\d{8}', '020-88888888...020-99999999')
print(ret)
for i in ret:
print(i.group())
ret = re.findall(r'(\d{3})-(\d{8})', '020-88888888...020-99999999')
print(ret)
ret = re.search(r'(\d{3})-(\d{8})', '020-88888888...020-99999999')
print(ret)
print(ret.group())
print(ret.group(1))
print(ret.group(2))
ret = re.search(r'(?P<a>\d{3})-(?P<b>\d{8})', '020-88888888...020-99999999')
print(ret)
print(ret.group('a'))
print(ret.group('b'))
#*至少0个 +至少1个 ?至少0个至多1个 {n}一定是n个 {m,n}至少m个至多n个
数量词都默认贪婪,能多不会少,但是要保证在匹配成功的情况下。
ret = re.search(r'[a-z]*', '0abc123')
print(ret)
ret = re.search(r'[a-z]+', '0abc123')
print(ret)
ret = re.search(r'[a-z]?', '0abc123')
print(ret)
ret = re.search(r'[a-z]?', 'abc123')
print(ret)
sub替换
ret = re.sub(r'\d','A','0abc123dsf')
print(ret)
ret = re.sub(r'(\d{3})-(\d{8})',r'\2-\1', '020-88888888')
print(ret)
^开头 $结尾 只能是 5-10个数字@qq.com
ret = re.match(r'^\d{5,10}@qq\.com$','123456@qq.com')
print(ret)
#案例1:验证邮箱
#email = input('输入QQ邮箱:')
ret = re.match(r'\d{5,10}@qq\.com',email)
#if ret!=None:
print('YES')
#else:
print('NO')
#案例2:爬取百度图片
#数量词默认是贪婪的,?加在数量词之后,将贪婪变成非贪婪
msg = '''<img class="currentImg" id="currentImg" onload="alog && alog('speed.set', 'c_firstPageComplete', +new Date); alog.fire && alog.fire('mark');" src="http://img2.ph.126.net/2zB3_wWPXlEW0RdwQa8d6A==/2268688312388037455.jpg" data-ispreload="0" width="506.3670411985" height="338" style="top: 0px; left: 239px; width: 434.457px; height: 290px; cursor: pointer;" log-rightclick="p=5.102" title="点击查看源网页">'''
print(msg)
ret = re.findall(r'src=".*"',msg)
print(ret)
ret = re.findall(r'src=".*?"',msg)
print(ret)
ret = re.findall(r'src="(.*?)"',msg)
print(ret[0])
2、正则表达式在django中的使用
在路由url中,如果有正则,在2.0版本使用re_path,之前使用path,正则使用分组,可以将组里的内容以参数的形式传入view视图函数中。
参数传递过来类型是字符串类型
可以给正则path里的分组定义名字,这样传递的参数,必须与分组的名字一致。
在路由匹配的过程中,如果多个path条件都能匹配,默认使用第一个。所以一般将大范围写在最后。