ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则表达式

2022-07-19 20:01:12  阅读:151  来源: 互联网

标签:goods 正则表达式 choice num user print dic


正则表达式

正则表达式主要用于数据的查找与筛选,在爬虫、运维等技术常常运用

导入

需求:编写代码校验用户输入的手机号是否合法:常见 13 15 17 18 19开头
1.python代码逻辑实现
phone_num = input("请输入你的电话号码:>>>").strip()
if phone_num.isdigit():
    if len(phone_num)==11:
        if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith('17') or phone_num.startswith('18') or phone_num.startswith('19'):
            phone_num = int(phone_num)
            print("输入的手机号合法")
        else:
            print("开头数字错误")
    else:
        print("电话号码十一位哦")
else:
    print("只能是纯数字哦")
    
2.正则表达式实现
import re
phone_num = input("请输入你的电话号码:>>>").strip()
if re.match('^(13|15|17|18|19)[0-9]{9}',phone_num):
    print("输入正确")
else:
    print("没输入对哦")
ps:正则表达式本质上是使用一些符号的组合产生一些特殊的含义,然后去字符串中筛选出符合条件的数据
   正则表达式线上测试网址:http://tool.chinaz.com/regex/

正则表达式之字符组

字符组在没有量词修饰的情况下,一次只会针对一个数据值;在中括号编写的多个数据值彼此都是或的关系

字符组 说明
[0-9] 匹配0-9之间任意的数字[0123456789]
[A-Z] 匹配大写字母A-Z的任意字母
[a-z] 匹配小写字母a-z的任意字母
[0-9a-zA-Z] 匹配数字、小写字母、大写字母都可以

正则表达式之特殊符号

特殊符号在没有量词修饰的情况下,一个符号一次只会针对一个数据值

特殊符号 说明
. 匹配出换行符(\n)以外的任意字符
\w 匹配字母或数字或下划线
\W 匹配非字母或数字或下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
a|b 匹配字符a或b
() 给正则表达式分组,不影响正则表达式的匹配(用于给后续的正则起别名,分组获取对应数据)
[] 匹配字符组中的字符
[^] 匹配除了字符组中字符的所有字符

正则表达式之量词

在正则表达式中多有的量词默认都是贪婪匹配(尽可能多的获取),且量词不能单独使用,必须跟在表达式的后面,并且只能影响紧挨着的左边哪一个

量词 说明
* 重复零次或更多次(默认就是尽可能的多)
+ 重复一次或更多次(默认就是尽可能的多)
重复零次或一次(默认就是一次)
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

正则表达式练习题

量词练习

正则 待匹配字符 结果
李.? 李杰和李莲英和李二棍子 李杰 李莲 李二
李.* 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
李.+ 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
李.{1,2} 李杰和李莲英和李二棍子 李杰和 李莲英 李二棍
李.*? 李杰和李莲英和李二棍子 李 李 李

字符集练习

正则 带匹配字符 结果
李[杰莲英二棍子]* 李杰和李莲英和李二棍子 李杰 李莲英 李二棍子
李 [^和]* 李杰和李莲英和李二棍子 李杰 李莲英李二棍子
[\d] 456bdha3 4 5 6 3
[\d]+ 456bdha3 456 3

贪婪匹配与非贪婪匹配

所有的量词默认就是贪婪匹配,但是如果在量词的后面紧跟一个问号,就变成非贪婪匹配;

待匹配的文本:<script>alert(123)</script>
1.贪婪匹配
正则表达式:<.*>
结果:<script>alert(123)</script>

2.非贪婪匹配
正则表达式:<.*?>
结果:<script>  </script>

ps:以后我们在使用贪婪匹配或者非贪婪匹配的时候一般都是用.*或者.*?,并且结束的标志有上述符号左右两边添加的表达式决定

取消转义

1.正则表达式:在斜杠前面加斜杠
    待匹配字符:\n	正则:\\n	结果:\n
    待匹配字符:\\n	正则:\\\\n  结果:\\n
2.python:在字符串前面加r
    r'\n'
    r'\\n'

正则表达式实战

常见的正则百度查找,在理解的基础上修改即可

1.校验用户手机号的正则:0?(13|14|15|17|18|19)[0-9]{9}
2.校验用户身份证的正则:\d{17}[\d|x]|\d{15}
3.校验用户邮箱的正则:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
4.校验用户qq号的正则:[1-9]([0-9]{5,11})

作业

项目功能:用户注册、用户登录、添加购物车、结算购物车、查看购物车、编辑购物车

import os
import json

base_dir = os.path.dirname(__file__)
db_dir_path = os.path.join(base_dir, 'db')
if not os.path.exists(db_dir_path):
    os.mkdir(db_dir_path)

tag_dic = {
    'username': None
}


def outer(func_name):
    def inner(*args, **kwargs):
        if tag_dic['username']:
            res = func_name(*args, **kwargs)
            return res
        else:
            print("请先登录")
            login()

    return inner


def register():
    while True:
        user_name = input("请输入你想注册的用户名>>>:").strip()
        user_pwd = input("请输入你的用户名密码>>>:").strip()
        confirm_pwd = input("请在输入一次密码>>>:").strip()
        if user_pwd != confirm_pwd:
            print("两次输入的密码不一致")
            continue
        user_file = os.path.join(db_dir_path, '%s.json' % user_name)
        if os.path.isfile(user_file):
            print("该用户名已经存在,重新换一个用户名吧")
            continue
        user_dic = {'name': user_name, 'pwd': user_pwd, 'balance': 15000, 'shop_car': {}}
        with open(user_file, 'w', encoding='utf8')as f:
            json.dump(user_dic, f)
            print(f"用户{user_name}添加成功")
            break


def login():
    while True:
        user_name = input("请输入你的用户名>>>:").strip()
        user_pwd = input("请输入你的密码>>>:").strip()
        user_file = os.path.join(db_dir_path, "%s.json" % user_name)
        if not os.path.isfile(user_file):
            print("用户名不存在,请重新登陆")
            continue
        with open(user_file, 'r', encoding='utf8') as f:
            user_dic = json.load(f)
        if user_dic['pwd'] == user_pwd:
            print(f"用户{user_name}登陆成功")
            tag_dic['username'] = user_name
            break
        else:
            print("用户名或密码错误,请重新登陆")


@outer
def add_shop_car():
    good_list = [
        ['挂壁面', 3],
        ['印度飞饼', 22],
        ['极品木瓜', 666],
        ['土耳其土豆', 999],
        ['伊拉克拌面', 1000],
        ['董卓戏张飞公仔', 2000],
        ['仿真玩偶', 10000]
    ]
    new_dic = {}
    while True:
        print("============================================")
        for i, j in enumerate(good_list, 1):  # 1 ['挂壁面', 3]
            print(f"商品编号:{i}    商品名称:{j[0]}    商品价格:{j[1]}")
        print("============================================")
        choice_id = input("请输入你想加入购物车商品对应的编号(q)>>>:").strip()
        if choice_id == 'q':
            user_file = os.path.join(db_dir_path, "%s.json" % tag_dic.get('username'))
            with open(user_file, 'r', encoding='utf8')as f:
                user_dic = json.load(f)
            old_dic = user_dic.get('shop_car')  # {}
            for i in new_dic:
                if i in old_dic:
                    old_dic[i][0] += new_dic[i][0]
                else:
                    old_dic[i] = new_dic[i]
            user_dic['shop_car'] = old_dic
            with open(user_file, 'w', encoding='utf8')as f1:
                json.dump(user_dic, f1, ensure_ascii=False)
                print("添加成功")
                break
        if not choice_id.isdigit():
            print("请输入数字")
            continue
        choice_id = int(choice_id)
        if choice_id not in range(1, len(good_list) + 1):
            print("你输入的编号超出范围了")
            continue
        goods_name = good_list[choice_id - 1][0]
        goods_price = good_list[choice_id - 1][1]
        goods_num = input("请输入你想添加的数量:>>>").strip()
        if not goods_num.isdigit():
            print("只能输入数字哦")
            continue
        goods_num = int(goods_num)
        if goods_name not in new_dic:
            new_dic[goods_name] = [goods_num, goods_price]  # {'极品木瓜':[个数,单价]}

        else:
            new_dic[goods_name][0] += goods_num


@outer
def account_shop_car():
    user_file = os.path.join(db_dir_path, "%s.json" % tag_dic.get('username'))
    with open(user_file, 'r', encoding='utf8')as f:
        user_dic = json.load(f)
    shop_car_goods= user_dic.get("shop_car")  # {'挂壁面': [914, 3], '印度飞饼': [38, 22], '极品木瓜': [39, 666], '土耳其土豆': [56, 999]}
    goods_sum = 0
    for item in shop_car_goods.values():  # [914, 3]
        price = item[0] * item[1]
        goods_sum += price
    if user_dic['balance']>= goods_sum:
        user_dic['balance'] -= goods_sum
        user_dic['shop_car'] = {}
        print(f"总价格为{goods_sum},剩余{user_dic['balance']}")
        with open(user_file, 'w', encoding='utf8')as f:
            json.dump(user_dic,f,ensure_ascii=False)
    else:
        print("余额不够")



@outer
def check_shop_car():
    user_file = os.path.join(db_dir_path, "%s.json" % tag_dic.get('username'))
    with open(user_file, 'r', encoding='utf8')as f:
        user_dic = json.load(f)
        goods_info = user_dic.get('shop_car') # {'挂壁面': [914, 3], '印度飞饼': [38, 22], '极品木瓜': [39, 666], '土耳其土豆': [56, 999]}
    print("============================================")
    for i in goods_info.items():  # ('挂壁面', [914, 3])
        print(f"商品名称:{i[0]}    商品数量:{i[1][0]}   商品价格:{i[1][1]}")
    print("============================================")
@outer
def edit_shop_car():
    user_file = os.path.join(db_dir_path, "%s.json" % tag_dic.get('username'))
    while True:
        with open(user_file, 'r', encoding='utf8')as f:
            user_dic = json.load(f)
            goods_info = user_dic.get('shop_car') # {'挂壁面': [914, 3], '印度飞饼': [38, 22], '极品木瓜': [39, 666], '土耳其土豆': [56, 999]}
        goods_list = []
        for i in goods_info:
            goods_list.append(i)
        print("============================================")
        for i,j in enumerate(goods_list,1):
            print(f"商品编号:{i}  商品名称:{j}")
        print("============================================")
        choice_id = input("请输入你想要修改商品名称的编号:>>>").strip()
        if not choice_id.isdigit():
            print("输入数字")
            continue
        choice_id = int(choice_id)
        if  choice_id not in range(1,len(goods_list)+1):
            print("超出了范围")
            continue

        goods_name = goods_list[choice_id - 1]
        choice_type = input("""请输入你想要修改的类型:
                            1.删除对应的商品
                            2.修改商品的数量
                            >>>:""").strip()
        if choice_type == '1':
            goods_info.pop(goods_name)
        elif choice_type =='2':
            choice_num = input("请输入你想修改的数量>>>:").strip()
            if not choice_num.isdigit():
                print("请输入数字")
                continue
            choice_num = int(choice_num)
            goods_info[goods_name][0] = choice_num
        else:
            print("输入不合法")
        user_dic['shop_car'] = goods_info
        with open(user_file, 'w', encoding='utf8')as f1:
            json.dump(user_dic,f1)
            break


dic_func = {
    '1': register,
    '2': login,
    '3': add_shop_car,
    '4': account_shop_car,
    '5': check_shop_car,
    '6': edit_shop_car
}
while True:
    print("""
    *****************************************
    1.用户注册
	2.用户登录
	3.添加购物车
	4.结算购物车
	5.查看购物车
	6.修改购物车
    *****************************************
   """)
    choice = input("请输入你想要的功能的序号:>>>").strip()
    if choice in dic_func:
        dic_func.get(choice)()
    else:
        print("输入的编号不正确")


标签:goods,正则表达式,choice,num,user,print,dic
来源: https://www.cnblogs.com/luonacx/p/16495530.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有