其他分享
首页 > 其他分享> > 正则表达式

正则表达式

作者:互联网

正则表达式

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

导入

需求:编写代码校验用户输入的手机号是否合法:常见 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