正则表达式

正则表达式

什么是正则表达式

正则表达式又称规则表达式,通过使用特殊字符组合产生的规则,在从字符串中匹配符合规则的数据

正则表达式字符组

正则表达式线上测试网址: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.|		匹配管道符|左侧的或右侧的数据(管道符|在很多场合都是或的意思)

()		给正则表达式分组,不影响表达式的使用
[]		匹配符合字符组中的数据
[^]		匹配除了字符组中的数据
img

正则表达式量词

1.正则表达式所有的量词都默认是贪婪匹配,尽可能多的获取数据,只有问号?默认是非贪婪匹配,只取一次数据
2.量词不能单独使用,必须在表达式的后面,而量词也只能运行前面的表达式

*	 	 重复零次或更多次(默认尽可能多)
+	 	 重复一次或更多次(默认尽可能多)
?		重复零次或一次(默认就一次)
{n}		 重复n次
{n, }	 重复n次到更多次
{n, m}	 重复n次到m次

正则表达式贪婪与非贪婪

1.正则表达式所有的量词都默认是贪婪匹配,只有在量词后面加问号?才是非贪婪匹配
2.在使用贪婪或非贪婪匹配时,如.*和.?,结束位置由这俩个符号左右的表达式决定

匹配文本:<akjshdja>askjd<ajlofd>akjswdh
正则表达式:<.*>		#贪婪匹配
匹配结果:<akjshdja>askjd<ajlofd>
正则表达式:<.*?>		#非贪婪匹配
匹配结果:
<akjshdja>
<ajlofd>
img

正则表达式取消转义

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('功能指令不存在')
posted @ 2022-07-19 19:35  无言以对啊  阅读(138)  评论(0)    收藏  举报