正则表达式
什么是正则表达式
正则表达式又称规则表达式,通过使用特殊字符组合产生的规则,在从字符串中匹配符合规则的数据
正则表达式字符组
正则表达式线上测试网址:https://tool.chinaz.com/regex/
1.匹配0到9中所有数字的任意一个数字
全称[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2.匹配a到z中所有小写字母的任意一个小写字母
[abcdefghijkonmopqrstuvwxyz]
3.匹配A到Z中所有大写字母的任意一个大写字母
[ABCDEFGHIJKONMOPQRSTUVWXYZ]
4.在括号内数据值都是或的关系
数字、大小写字母都可以 [0-9a-zA-Z]
正则表达式特殊符号
1.. 匹配除了换行符以外的任意字符
2.\w 匹配字母或数字或下划线
3.\s 匹配任意空白字符
4.\d 匹配数字
5.\b 匹配单词的开始或结束
6.^ 匹配字符串的开始
7.$ 匹配字符串的结束
8.| 匹配管道符|左侧的或右侧的数据(管道符|在很多场合都是或的意思)
() 给正则表达式分组,不影响表达式的使用
[] 匹配符合字符组中的数据
[^] 匹配除了字符组中的数据
正则表达式量词
1.正则表达式所有的量词都默认是贪婪匹配,尽可能多的获取数据,只有问号?默认是非贪婪匹配,只取一次数据
2.量词不能单独使用,必须在表达式的后面,而量词也只能运行前面的表达式
* 重复零次或更多次(默认尽可能多)
+ 重复一次或更多次(默认尽可能多)
? 重复零次或一次(默认就一次)
{n} 重复n次
{n, } 重复n次到更多次
{n, m} 重复n次到m次
正则表达式贪婪与非贪婪
1.正则表达式所有的量词都默认是贪婪匹配,只有在量词后面加问号?才是非贪婪匹配
2.在使用贪婪或非贪婪匹配时,如.*和.?,结束位置由这俩个符号左右的表达式决定
匹配文本:<akjshdja>askjd<ajlofd>akjswdh
正则表达式:<.*> #贪婪匹配
匹配结果:<akjshdja>askjd<ajlofd>
正则表达式:<.*?> #非贪婪匹配
匹配结果:
<akjshdja>
<ajlofd>
正则表达式取消转义
1.正则表达式取消斜杠与字母的特殊含义,就在前面加斜杠
匹配文本 表达式 匹配结果
\n \\n \n
\\n \\\\n \\n
改善作业
# 4.周末大作业(尝试编写)
# # 项目功能
# 1.用户注册
# 2.用户登录
# 3.添加购物车
# 4.结算购物车
# # 项目说明
# 用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件
# 数据格式 {"name":"jason","pwd":123}
# # ps:文件名可以直接用用户名便于校验
# 用户注册时给每个用户添加两个默认的键值对(账户余额 购物车)
# {"balance":15000,"shop_car":{}}
# 添加购物车功能 商品列表可以自定义或者采用下列格式
# good_list = [
# ['挂壁面',3]
# ['印度飞饼', 22]
# ['极品木瓜', 666],
# ['土耳其土豆', 999],
# ['伊拉克拌面', 1000],
# ['董卓戏张飞公仔', 2000],
# ['仿真玩偶', 10000]
# ]
# 用户可以反复添加商品,在购物车中记录数量
# {'极品木瓜':[个数,单价]}
# 结算购物车
# 获取用户购物车中所有的商品计算总价并结算即可
# 针对添加购物车和结算只有登录的用户才可以执行
# 3.尝试扩展购物车功能(课外扩展)
# 查看购物车数据(用较为好看的方式展示)
# 编辑购物车数据(商品的移除、数量的增减)
import json
import os
uesr_db = os.getcwd()
db = os.path.join(uesr_db, 'db目录')
if not os.path.isdir(db):
os.makedirs(db)
uesr_data = {'name': False}
goods_data = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]]
def func1():
name = input('请输入用户名>>>:').strip()
res1 = os.listdir(db)
if f'{name}.txt' not in res1:
pwd = input('请输入用户密码>>>:').strip()
ammirm_pwd = input('请再次输入用户密码确认>>>:').strip()
if pwd == ammirm_pwd:
data = {'name': name, 'pwd': pwd, 'balance': 15000, 'shop_car': {}}
with open(fr'{db}\{name}.txt', 'w', encoding='utf8')as f:
json.dump(data, f)
return
else:
print('再次输入密码错误')
else:
print('用户名已存在')
def func2():
name = input('请输入用户名>>>:').strip()
res1 = os.listdir(db)
if f'{name}.txt' in res1:
with open(fr'{db}\{name}.txt', 'r', encoding='utf8')as f:
info = json.load(f)
pwd = input('请输入用户密码>>>:').strip()
if pwd == info.get('pwd'):
print('登录成功')
global uesr_data
uesr_data = {'name': name}
return
else:
print('密码错误')
else:
print('该用户名不存在')
def func3():
name = uesr_data.get('name')
if name:
while True:
for i, j in enumerate(goods_data, start=1):
print(f"商品编号:{i} | 商品名称:{j[0]} | 商品单价:{j[1]}")
res_goods = input('输入您要购买的商品(q)>>>:').strip()
if not res_goods == 'q':
if res_goods.isdigit():
res_goods = int(res_goods)
if res_goods <= len(goods_data):
goods_v = goods_data[res_goods - 1]
goods_num = input('输入商品的数量>>>:').strip()
goods_num = int(goods_num)
data_dict = {}
data_dict[goods_v[0]] = [goods_num, goods_v[1]]
with open(fr'{db}\{name}.txt', 'r', encoding='utf8')as f:
info = json.load(f)
shop_car = info.get('shop_car')
for i in data_dict:
if i in shop_car:
shop_car.get(i)[0] += goods_num
info['shop_car'] = shop_car
else:
shop_car[i] = data_dict.get(i)
info['shop_car'] = shop_car
with open(fr'{db}\{name}.txt', 'w', encoding='utf8')as w:
json.dump(info, w)
print('商品添加成功')
continue
else:
print('没有该商品')
continue
else:
print('没有该商品')
continue
else:
break
else:
print('您未登录')
def func4():
name = uesr_data.get('name')
if name:
with open(fr'{db}\{name}.txt', 'r', encoding='utf8')as f:
info = json.load(f)
shop_car = info.get('shop_car')
balance = info.get('balance')
money = 0
for k in shop_car:
values = shop_car.get(k)
money += int(values[0]) * int(values[1])
if balance > money:
res_balance = balance - money
print(f'账户剩余{res_balance}usd')
info['shop_car'] = {}
info['balance'] = res_balance
with open(fr'{db}\{name}.txt', 'w', encoding='utf8')as f:
json.dump(info, f)
else:
print('余而不足')
else:
print('您未登录')
def func5():
name = uesr_data.get('name')
if name:
with open(fr'{db}\{name}.txt', 'r', encoding='utf8')as f:
info = json.load(f)
shop_car = info.get('shop_car')
order = input('1:删除商品'
'2:修改商品数量>>>:').strip()
num = 1
for item in shop_car.items():
print(f"商品编号{num} | 商品名称:{item[0]} | 商品数量:{item[1][0]} | 商品单价:{item[1][1]}")
num += 1
if order == '1':
res_goods = input('输入您要删除的商品>>>:').strip()
if res_goods.isdigit():
res_goods = int(res_goods)
if res_goods <= len(shop_car):
count = 1
for i in shop_car:
if count == res_goods:
goods_k = i
else:
count += 1
del shop_car[goods_k]
info['shop_car'] = shop_car
with open(fr'{db}\{name}.txt', 'w', encoding='utf8')as f:
json.dump(info, f)
print('删除成功')
else:
print('没有该商品')
else:
print('没有该商品')
elif order == '2':
res_goods = input('输入您要修改的商品>>>:').strip()
if res_goods.isdigit():
res_goods = int(res_goods)
if res_goods <= len(shop_car):
goods_num = input('输入修改后商品的数量>>>:').strip()
count = 1
for i in shop_car:
if count == res_goods:
goods_k = i
else:
count += 1
goods_num = int(goods_num)
shop_car[goods_k] = [goods_num, shop_car.get(goods_k)[1]]
info['shop_car'] = shop_car
with open(fr'{db}\{name}.txt', 'w', encoding='utf8')as w:
json.dump(info, w)
print('数量修改成功')
else:
print('没有该商品')
else:
print('没有该商品')
else:
print('没有这个指令')
else:
print('您未登录')
def func6():
name = uesr_data.get('name')
if name:
manage = input('输入管理员密码>>>:').strip()
if manage == '123':
order = input('1:删除商品 2:增加商品>>>').strip()
if order == '1':
for i, j in enumerate(goods_data, start=1):
print(f"商品编号:{i} | 商品名称:{j[0]} | 商品单价:{j[1]}")
res_order = input('你要删除的商品编号>>>:')
res_order = int(res_order)
if res_order <= len(goods_data):
del goods_data[res_order - 1]
print('删除成功')
else:
print('没有该商品')
elif order == '2':
res_name = input('新增的商品名字>>>:')
res_money = input('新增的商品价格>>>:')
goods_data.append([res_name, res_money])
else:
print('密码错误')
else:
print('您未登录')
data = {'1': func1,
'2': func2,
'3': func3,
'4': func4,
'5': func5,
'6': func6}
while True:
print('1:用户注册'
'2:用户登录'
'3:添加购物车'
'4:结算购物车'
'5:管理购物车'
'6:管理员登录')
res = input('输入功能指令>>>:').strip()
if res in data.keys():
uesr_res = data.get(res)
uesr_res()
else:
print('功能指令不存在')