内容概要
- 购物车程序设计
- 正则表达式
- 字符组
- 量词
- 贪婪匹配与非贪婪匹配
- 转义符
- 正则表达式实战
- re模块
- 简易爬虫题目
购物车程序设计
1.项目框架搭建
空函数
功能字典
循环匹配功能执行
2.项目注册功能
获取用户输入用户名密码,并二次校验密码
用户数据注册保存db目录中
获取执行文件所在目录路径
自动拼接存储用户数据db目录路径(如不存在,则自动创建)
拼接用户文件的绝对路径
判断绝对路径是否存在
如果存在表示用户已注册
如果不在则使用json模块序列化 存写数据进入 json文件内部
3.用户登录功能
获取用户输入用户名和密码
拼接用户文件路径,并判断用户名是否在用户文件路径中
如果存在则读取该文件中数据信息,并对密码进行比对
成功则登录,并保存用户状态修改用户状态字典
失败则返回
4.装饰器
装饰需要登录操作的功能,通过用户字典是否有值
如果需要登录则使用语法糖
5.项目购物车功能
获取商品信息并枚举循环打印
获取用户输入商品编号及商品数量
考虑到要写入json文件中,应该创建临时购物车先存放用户挑选产品
最后一次性写入json文件当中
临时购物车中添加键值对
如果用户json文件购物车里面已经存在商品,就不能用临时购物车替换
所以如果商品存在就修改它现有数量
如果不存在就添加进去
退出购物车程序之前需要一次性修改当前登录用户购物车数据
6.购物车结算功能
读取用户数据
循环遍历购物车商品数据
判断是否超出余额
如果没有超出 则完成扣款 清空购物车并保存
正则表达式
1.正则表达式
正则表达式是一门独立的技术,所有编程语言都可以使用正则表达式
它主要的作用是:
# 利用一些特符号(也可以直接写需要查找的具体字符)的组合产生一些特殊的含义然后去字符串中去筛选出符合条件的数据
'''筛选数据---匹配数据'''
https://tool.chinaz.com/regex # 在线测试正则网址
字符组
# 字符组
字符组默认匹配方式为一个一个比对(匹配)
[0123456789] # 匹配0——9的任意一个数字
[0-9] # 匹配0——9的任意一个数字 (缩写)
[a-z] # 匹配小写字母a-z的任意一个字母(缩写)
[A-Z] # 匹配大写字母A-Z的任意一个字母 (缩写)
[0-9a-zA-] # 匹配数据或者小写字母或者大写字母
'''我们可以通过上述信息可以看出在字符组中[]里面的数据都是或的意思'''
特殊符号
'''特殊符号默认匹配方式是一个一个比对(匹配)'''
. # 匹配除换行符以外的任意字符
\w #匹配数字、字母、下划线的字符
\W(大写) # 匹配除数字、字母、下划线的任意字符
\d # 匹配 数字
^ # 匹配字符串开头
$ # 匹配字符串结尾
a|b # 表示匹配a或b |是或的意思
() # 表示一个组,并不影响匹配功能
[] # 字符组 内部填写内容默认都是或的关系
[^] # 表示除了^开头之外的其他所有字符
量词
# 量词
* # 匹配0次或者多次 默认是无穷次
+ # 匹配一次或多次 默认是无穷次
? # 匹配0次或一次 作为量词来说意义不大,主要用于非贪婪匹配
{n} # 重复n次
{n,} # 重复n 或更多次 默认是多次{无穷次}
{n,m} #重复 n,m次 默认是m次
'''正则表达式默认情况下都是贪婪匹配--尽可能多的去匹配'''
量词必须结合表达式一起使用,不能单独出现,并且只影响左手边第一个表达式
贪婪匹配与非贪婪匹配
# 贪婪匹配:
所有量词都是贪婪匹配,如果想要变为非贪婪匹配,我们只需要在量词后面加上问号
待匹配的文本
<strip>larb(123)</script>
我们使用正则表达式来匹配内容
<.*>
# 我们会得到 <strip>larb(123)</script> 这一条匹配结果
因为.* 就是贪婪匹配,除换行符之外的所有数据都可以被匹配
<> 前后的精准匹配由于与文本中的首尾都一样,所以在贪婪匹配下会看量词左右的匹配条件
# 我们在使用.* 贪婪匹配的时候,结束条件一般在左右明确指定
非贪婪匹配
<.*?>
由于在量词后面加了问号,则不属于贪婪匹配
此时就会根据左右两边的精准匹配条件进行匹配
得到<strip> </script> 这两个个结果
转义符
'''斜杠与字母的组合有时候含有特殊含义'''
\n # 匹配的是换行符
\\n # 匹配的是文本\n
如果我们需要匹配文本\\n
则:
\\\\n 需要这样写
如果我们在Python 中使用 我们可以在字符串前边加r来取消转义
正则表达式应用场景
1.校验用户身份证号的正则
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
2.校验邮箱的正则
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
3.校验用户手机号的正则(座机、移动)
0?(13|14|15|17|18|19)[0-9]{9} # 手机
[0-9-()()]{7,18} # 座机
4.校验用户qq号的正则
[1-9]([0-9]{5,11})
5.格式日期
\d{4}(\-|\/|.)\d{1,2}\1\d{1,2} # 2019-10-24
6.校验ip地址正则
(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)
re模块
在python中我们想使用正则表达式
那么我们需要导入re模块
import re
findall() / finditer()
findall() 此方法里面需要填写两个参数,一个是正则表达式,一个是待匹配的数据
# 它会返回正则表达式匹配成功后的成果(列表形式)
finditer()
# 它跟findall 方法一样,但是返回的结果是一个迭代器对象,这个方法更节省内存
search/match
search() # 匹配到一个符合条件的数据就立刻结束
res1 = re.search('a','cacasdasdaweqweqa')
print(res1) # 得到的是一个 <re.Match object; span=(1, 2), match='a'> 对象
# 我们需要通过 print(res1.group()) 方法 就可以获得匹配到的值
print(res1.group())
match()
res2 = re.match('a','acasdasdaweqweqa')
print(res1) # 判断开头是否为 正则表达式匹配的内容,如果不是返回None 如果是 返回<re.Match object; span=(1, 2), match='a'>
print(res1.group()) # 我们需要通过 print(res2.group()) 方法 就可以获得匹配到的值 a
compile
compile()
obj = re.compile('\d{2}') # 当某一个正则表达式需要频繁使用的时候 我们可以做成模板
res1 = obj.findall('234679879078042344')
res2 = obj.findall('a12341243jdk32423')
print(res1, res2)
split/sub/subn
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd']
ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1) # 将数字替换成'H',参数1表示只替换1个
print(ret) # evaHjason4yuan4
ret = re.subn('\d', 'H', 'eva3jason4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret) # ('evaHjasonHyuanH', 3)
re模块补充说明:
1.分组优先
# res = re.findall('www.(baidu|taobao).com', 'www.taobao.com')
# print(res) # ['taobao']
# findall分组优先展示:优先展示括号内正则表达式匹配到的内容
# res = re.findall('www.(?:baidu|oldboy).com', 'www.taobao.com')
# print(res) # ['www.taobao.com']
# res = re.search('www.(baidu|taobao).com', 'www.taobao.com')
# print(res.group()) # www.taobao.com
# res = re.match('www.(baidu|taobao).com', 'www.taobao.com')
# print(res.group()) # www.taobao.com
2.分组别名
res = re.search('www.(?P<content>baidu|taobao)(?P<hei>.com)', 'www.taobao.com')
print(res.group()) # www.taobao.com
print(res.group('content')) # taobao
print(res.group(0)) # www.taobao.com
print(res.group(1)) # taobao
print(res.group(2)) # .com
print(res.group('hei')) # .com
练习题及答案
爬网站数据并格式化输出
标签:www,匹配,正则表达式,re,taobao,print,com
From: https://www.cnblogs.com/ddsuifeng/p/16825970.html