1.什么是正则表达式
正则表达式是一些特殊的符号组合在一起产生一些特殊含义,它能帮助我们方便的检查一个字符串中符合条件的数据值。
正则表达式线上测试网址:http://tool.chinaz.com/regex/
2.正则表达式之字符组
字符组就是一组字符,在正则表达式中,列出用
[]之
间所有的字符。简单的字符组比如[0-9]、[a-z]、[A-Z]等。1.[0-9] 列出字符组中0到9之间的任意数字:
字符组:"0123ab456cd789"
正则表达式:[0-9]
结果是:[0123456789]
2.[a-z] 列出字符组中a到z之间的任意字母:
字符组:"abcd1ef2ghi98z"
正则表达式:[a-z]
结果是:[abcdefghiz]
3.[A-Z] 列出字符组中A到Z之间的任意字母:
字符组:"AB12CD3abEFZ"
正则表达式:[A-Z]
结果是:[ABCDEFZ]
ps:字符组在没有量词修饰的情况一次只会针对一个数据值。
3.正则表达式之特殊符
常用特殊符号 1 . 匹配除换行符外的任意字符 2 \w 匹配字母或数字或下划线 3 \W 匹配非字母或数字或下划线 4 \d 匹配数字 5 ^ 匹配字符串的开头 6 $ 匹配字符串的结尾 7 | 或;a|b:匹配a或b 8 () 给正则表达式分组,不影响正则表达式的匹配 9 [] 匹配字符组中的字符 10 [^] 匹配除了字符组中字符的所有字符 ps:1.当^与$组合使用能够明确的限制想要查找的具体数据
2.()用来给正则起别名不影响正则表达式的匹配
3.特殊符号在没有量词修饰的情况一个符号一次只会针对一个数据值
4.正则表达式之量词
量词 1 * 重复零次或更多次(默认尽可能多) 2 + 重复一次或更多次(默认尽可能多) 3 ? 重复零次或一次(默认一次) 4 {n} 重复n次 5 {n,} 重复n次或更多次 6 {n,m} 重复n到m次 ps:1.正则表达式中所有的量词默认都是尽可能的多匹配(贪婪匹配)
2.量词是不能单独使用的必须跟在一个正则表达式后面,并且只能影响这一个正则表达式
eg:
基础练习举例 符号 正则表达式 字符组 匹配结果 . 海. 海燕海鸥海狮 海燕
海鸥
海狮^ ^海. 海燕海鸥海狮 海燕 $ 海.$ 海燕海鸥海狮 海狮 ? 海.? 海燕与海鸥的海誓山盟 海燕
海鸥
海誓+ 海.+ 海燕与海鸥的海誓山盟 海燕与海鸥的海誓山盟 * 海.* 海燕与海鸥的海誓山盟 海燕与海鸥的海誓山盟
{} 海.{1,2} 海燕与海鸥的海誓山盟 海燕与
海鸥的
海誓山[]* 海[燕鸥誓山盟]* 海燕与海鸥的海誓山盟 海燕
海鸥
海誓山盟[^]* 海[^和]* 海燕与海鸥的海誓山盟 海燕与海鸥的海誓山盟 [\d] [\d] 123abc456df7 1234567 [\d]+ [\d]+ 123abc456df7 123
456
7
5.贪婪匹配与非贪婪匹配
1.贪婪匹配
默认都是贪婪匹配
2.非贪婪模式
只需要在量词后面加上"?"就可以让贪婪匹配变成非贪婪匹配
eg:
贪婪匹配 字符组 结果 [.*] <div class="ToolHead"><div> <div class="ToolHead"><div> 非贪婪匹配 字符组 结果 [.*?] <div class="ToolHead"><div> <div class="ToolHead"><div> ps:以后我们在使用贪婪匹配或者非贪婪匹配的时候一般都是用“.*”或“.*?”,并且结束的标志有上述符号左右两边添加的表达式绝对。
6.取消转义
1.使用场景
当要匹配没有没有换行含义的"\n"时需要取消它自带的换行含义
2.使用方式
在正则表达式中取消转义使用 "\" (每个"\"只能取消一个字符的转义)
eg: \\n \n \\\\n \\n
在python中取消转义推荐使用 "r" (也可以使用\)eg: r'\n' \n r'\\n' \\n
import json
import os
now_dir = os.path.dirname(__file__)
db_dir = os.path.join(now_dir,'db') # /Users/huyufeng/Desktop/每日总结/db
if not os.path.exists(db_dir): # 如果没有db目录则创建一个
os.mkdir((db_dir))
is_login = {'username':''} # 标记登陆的用户
def outter(func):
def inter(*arge,**kwargs):
if is_login.get('username'): # 用装饰器判断用户是否登陆
res = func(*arge,**kwargs) # 登陆则返回运行
return res
else:
print('用户未登陆') # 未登陆则跳到登陆操作
user_landing()
return inter
def user_enroll():
while True:
user_name = input('请输入注册用户名>>>:')
user_pwd = input('请输入注册密码>>>:')
Confirm_pwd = input('再次确定密码>>>:')
if not user_pwd == Confirm_pwd:
print('密码不一致')
continue
name_file = os.path.join(db_dir,'%s.json'%user_name) # 拼接用户文件名的绝对路径
if os.path.exists(name_file):
print('用户名已存在') # 因为文件名是用户名所以如果文件已经在了说明该用户已经注册
continue
temp_user_dict = {
'name': user_name,
'pwd': user_pwd,
'balance': 15000,
'shop_car': {}
}
with open(name_file,'w',encoding='utf8') as f: # 往对应的用户名文件内填入信息
json.dump(temp_user_dict,f)
print('用户%s注册成功!'%user_name,)
return
def user_landing():
while True:
username = input('请输入登陆用户名>>>:').strip()
userpwd = input('请输入登陆密码>>>:').strip()
name_file = os.path.join(db_dir, '%s.json' % username)
if not os.path.isfile(name_file):
print('该用户不存在')
continue
with open(name_file, 'r', encoding='utf8') as f:
user_dict = json.load(f)
# 5.判断用户密码是否一致
if userpwd == user_dict.get('pwd'):
# 保存登录用户的用户名(登录状态)
is_login['username'] = user_dict.get('name')
print('登录成功')
return
else:
print('密码错误')
@outter
def user_Add():
good_list = [
['挂壁面',3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
temporary_dict ={} # 定义一个空字典存放选好的购物车
while True:
for i,j in enumerate(good_list): # 枚举打印商品信息
print('商品编号:%s & 商品名称:%s & 商品价格:%s'%(i,j[0],j[1]))
target_good_id = input('请输入需要购买商品的编号(q结束)>>>:').strip() # 用户选择 q结束选择
if target_good_id == 'q':
file_path = os.path.join(db_dir,'%s.json'%is_login.get('username')) # 拼接登陆用户的文件绝对路径 后面需要写入等操作
with open(file_path,'r',encoding='utf8') as f: # 读取当前登陆的那个用户文件
user_dict = json.load(f)
old_shop_car = user_dict.get('shop_car') #将原本用户文件内的购物车信息先存放到old_shop_car中以防等会直接覆盖
for i in temporary_dict: # 用i去遍历零时存放购物车信息的字典(把用户选的信息一个个取出来)
if i in old_shop_car: # 一个个取出来判断未添加用户选的购物车信息时在不在里面(新选好的购物车和原本文件里的购物车对比)
old_shop_car.get(i)[0] += temporary_dict.get(i)[0] # 原本文件购物车里已经有现在再次选的物品信息时,将后面的数量进行累加
else:
old_shop_car[i] = temporary_dict[i] # 原本文件中没有当前选的商品信息时 直接把当前选择的商品信息覆盖写入即可
user_dict['shop_car'] = old_shop_car # 将处理好的临时购物车添加到用户字典的购物车信息中
with open(file_path,'w',encoding='utf8') as f: # 再将其处理好的用户字典信息写入到对应的用户名文件中
json.dump(user_dict,f)
print('购物车添加成功')
return
if not target_good_id.isdigit(): # 判断输入的编号是不是数字,不是则返回重新输入
print('请输入数字编号')
continue
target_good_id = int(target_good_id) # 输入的编号转换整型
if target_good_id not in range(len(good_list)): # 如果输入的数字超过总长度就打印超出 并返回重新输入
print('商品超出范围')
continue
target_good_info = good_list[target_good_id] # target_good_info等于输入编号对应的商品信息
target_good_name = target_good_info[0] # target_good_name等于商品信息的商品名
target_good_price = target_good_info[1] # target_good_price等于商品的数量
target_good_num = input('请输入想要购买的商品数量>>>:').strip() #获取用户想要购买的数量
if not target_good_num.isdigit(): # 如果获取的不是数字则打印并返回重新输入
print('商品数量只能是数字>>>:')
continue
target_good_num = int(target_good_num) # 转换成整型
if target_good_name in temporary_dict: # 如果购买的商品名字已经存在在临时购物车字典里
value_list = temporary_dict.get(target_good_name) # value_list等于临时购物车字典中对应商品信息
value_list[0] += target_good_num # 对索引0的数量进行累加
temporary_dict[target_good_name] = value_list # 再将自增后的数据返回到临时购物车字典里
else:
temporary_dict[target_good_name] = [target_good_num,target_good_price] # 当不存在时直接新增键值对
@outter
def user_settlement():
file_path = os.path.join(db_dir,'%s.json'%is_login.get('username')) # 拼接当前登陆用户对应文件的绝对路径
with open(file_path,'r',encoding='utf8') as f:
user_dict = json.load(f)
shop_car = user_dict.get('shop_car') # 读取用户购物车信息
if not shop_car: # 如果购物车没东西则打印
print('你购物车里没东西')
return
total_money = 0 # 定义空金额
current_balance = user_dict.get('balance') # current_balance 等于购物车商品单价
for values in shop_car.values(): # 取出购物车字典中所有值
total_money += values[0] * values[1] # 初始金额total_money=0 每次自增商品单价乘数量(total_money就是一共花的钱)
if current_balance >= total_money: # 如果本金大于等于消费金额
rest_money = current_balance - total_money # 剩余金额=本金-花费金额
user_dict['balance'] = rest_money # 将用户字典里的金额该成剩余的钱
user_dict['shop_car'] = {} # 将消费完的购物车清空
with open(file_path,'w',encoding='utf8') as f: # 把经过计算后的金额和空购物车写入用户文件中
json.dump(user_dict,f)
print('今日消费:%s 剩余:%s'% total_money,rest_money)
else:
print('买不起滚')
return
@outter
def look_shop_car():
# 拼接路径打开当前登陆用户的文件
# 读取用户字典信息
# 再把用户文件内的购物车、金额信息读取出来
# 读出来为空说明还没有添加
# 利用字典的items内置方法把商品键值对取出
# 再利用索引将商品信息分开格式化打印
# 计算购物车内一共花费了多少钱
# 当消费金额大于本金时提示用户花费多少和充值
# 如果没有超预算则现实花费多少剩余金额
look_pash = os.path.join(db_dir,'%s.json'%is_login.get('username'))
with open(look_pash,'r',encoding='utf8') as f:
look_dick = json.load(f)
user_shop_car = look_dick.get('shop_car')
user_money = look_dick.get('balance')
if not user_shop_car:
print('购物车内未添加商品信息')
for i in user_shop_car.items(): # ('印度飞饼', [100, 22]) 元组
# print(i)
print('商品信息:%s 商品数量:%s 商品单价:%s' %(i[0],i[1][0],i[1][1]))
consume_money = int(i[1][0]) * int(i[1][1])
if consume_money > user_money:
print('不好意思你的余额不足,本次消费:%s元,请充值!'%consume_money)
else:
rest_money = user_money - consume_money
print('购物车总花费金额:%s 用户剩余金额:%s '%consume_money,rest_money)
@outter
def del_shop_car():
# 拼接用户文件绝对路径
# 读取文件内购物车信息
# 展示给用户并获取用户需要移除的编号
# 判断编号是否超出范围
# 超出了打印暂无此商品
# 没超出则删除此商品信息
# 操作完的字典再重新写入文件内
user_pach = os.path.join(db_dir,'%s.json'%is_login.get('username'))
with open(user_pach,'r',encoding='utf8') as f:
user_Information = json.load(f)
user_shop_car = user_Information.get('shop_car') #{'印度飞饼': [100, 22], '仿真玩偶': [50, 10000]}
if not user_shop_car:
print('未添加购物车')
while True:
user_shop_car = user_Information.get('shop_car') # {'印度飞饼': [100, 22], '仿真玩偶': [50, 10000]}
if not user_shop_car:
print('未添加购物车')
user_shop_car_list = list(user_shop_car.items())
for i, j in enumerate(user_shop_car_list):
print('商品编号:%s 商品名:%s 商品数量:%s 商品单价:%s ' % (i, j[0], j[1][0], j[1][1]))
del_id = input('1:删除商品 2:修改商品数量>>>:').strip()
if not del_id.isdigit() or 2 < int(del_id) or 1 > int(del_id):
print('只能输入数字1或者2')
return
if del_id == '1':
user_del_id = input('请输入需要删除的商品编号>>>:').strip()
if not user_del_id.isdigit():
print('编号必须是数字')
return
new_user_del_id = int(user_del_id)
if new_user_del_id not in range(len(user_shop_car_list)):
print('编号超出范围')
return
user_name = user_shop_car_list[new_user_del_id][0]
user_shop_car.pop(user_name)
print(user_shop_car)
else:
revise_user_del_id = input('请输入需要修改的商品编号>>>:').strip()
if not revise_user_del_id.isdigit():
print('编号必须是数字')
return
revise_user_id = int(revise_user_del_id)
if revise_user_id not in range(len(user_shop_car_list)):
print('编号超出范围')
return
revise_shop_num = input('请输入修改的数量>>>:').strip()
if not revise_shop_num.isdigit():
print('数量必须是数字!')
return
j[1][0] == revise_shop_num
while True:
print('''
1.用户注册
2.用户登录
3.添加购物车
4.结算购物车
5.查看用户购物车
6.移除购物车信息''')
function_dict = {'1':user_enroll,'2':user_landing,'3':user_Add,'4':user_settlement,
'5':look_shop_car,'6':del_shop_car}
function_id = input('请输入功能编号>>>:').strip()
if function_id in function_dict:
function_dict.get(function_id)()
else:
print('好好输功能!')
continue