• 【Python】从入门到上头— 使用re模块用于快速实现正则表达式需求(11)


    正则表达式语法规则

    re模块

    正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

    • Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用\转义,所以要特别注意:
    s = 'ABC\\-001' # Python的字符串
    # 对应的正则表达式字符串变成:
    # 'ABC\-001'
    
    • 1
    • 2
    • 3

    因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了:

    s = r'ABC\-001' # Python的字符串
    # 对应的正则表达式字符串不变:
    # 'ABC\-001'
    
    • 1
    • 2
    • 3

    先看看如何判断正则表达式是否匹配:

    import  re
    
    a = re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
    print(a)
    b = re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
    print(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。

    使用

    import re
    
    test = '用户输入的字符串'
    if re.match(r'正则表达式', test):
        print('ok')
    else:
        print('failed')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    切分字符串

    用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:

    c = 'a b   c'.split(' ')
    print(c)
    #['a', 'b', '', '', 'c']
    
    • 1
    • 2
    • 3
    • 无法识别连续的空格

    正则切分

    d = re.split(r'\s+', 'a b   c')
    print(d)
    #['a', 'b', 'c']
    
    • 1
    • 2
    • 3

    无论多少个空格都可以正常分割。加入,试试:

    e = re.split(r'[\s\,]+', 'a,b, c  d')
    print(e)
    #['a', 'b', 'c', 'd']
    
    • 1
    • 2
    • 3

    再加入;试试:

    f = re.split(r'[\s\,\;]+', 'a,b;; c  d')
    print(f)
    #['a', 'b', 'c', 'd']
    
    • 1
    • 2
    • 3

    分组

    除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)

    • 比如:^(\d{3})-(\d{3,8})$分别定义了2个组,可以直接从匹配的字符串中提取出区号和本地号码
    g = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
    print(g.group(0))
    print(g.group(1))
    print(g.group(2))
    #010-12345
    #010
    #12345
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。

    • 注意到group(0)永远是与整个正则表达式相匹配的字符串,group(1)、group(2)……表示第1、2、……个子串。

    提取子串非常有用。来看一个更凶残的例子:

    h = '19:05:30'
    m =  re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$',h)
    print(m.groups())
    #('19', '05', '30')
    
    • 1
    • 2
    • 3
    • 4

    这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期:

    '^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'
    
    • 1

    对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。

    贪婪匹配

    当我们在Python中使用正则表达式时,re模块内部会干两件事情:

    • 编译正则表达式,如果正则表达式的语法不合法,会报错;
    • 用编译后的正则表达式去匹配字符串。

    如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以·预编译该正则表达式·,接下来重复使用时就不需要编译这个步骤了,直接匹配:

    # 编译:
    re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
    # 使用:
    a2 = re_telephone.match('010-12345').groups()
    print(a2)
    # ('010', '12345')
    a3 = re_telephone.match('010-8086').groups()
    print(a3)
    # ('010', '8086')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    ADG dataguard ALL_LOGFILES,ALL_ROLES
    2023腾讯云服务器价格表(轻量/CVM/免费/GPU)
    Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力
    【案例】由coredump引起的思考:程序的加载流程
    1.EdgeX实战 Ubuntu18.04搭建运行环境
    06、SpringBoot+微信支付 -->商户定时查订单状态、用户取消订单(关闭订单API)、查询订单API--到微信支付平台查询订单
    maven的安装和配置以及如何在IDEA中配置maven
    计算机毕业设计Java高校墨香文学社管理系统(源码+系统+mysql数据库+lw文档)
    JS中的debounce与throttle(防抖与节流)
    跨境erp系统功能分析
  • 原文地址:https://blog.csdn.net/qq877728715/article/details/132833894