33、正则表达式

(六)正则表达式
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 &amp;&amp; alog('speed.set', 'c_firstPageComplete', +new Date); alog.fire &amp;&amp; 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条件都能匹配,默认使用第一个。所以一般将大范围写在最后。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值