正则表达式

本文详细介绍了正则表达式的基本概念,包括字符组、特殊符号的使用,以及量词的概念。通过实例展示了如何匹配字符串、限制匹配范围等。此外,还讲解了贪婪匹配与非贪婪匹配的区别,并提供了实际操作示例。最后,文章涵盖了解决正则表达式中转义问题的方法。整个内容结合实际代码示例,帮助读者深入理解和运用正则表达式。
摘要由CSDN通过智能技术生成

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]123abc456df71234567
[\d]+[\d]+123abc456df7123
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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值