zoukankan      html  css  js  c++  java
  • python3进阶之正则表达式之re模块之分组(group)、贪心匹配、编译

    1.group

      除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:^(d{3})-(d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码

    m = re.match(r'^(d{3})-(d{3,8})$', '010-12345')
    print(m.group(0))
    print(m.group(1))
    print(m.group(2))
    
    # 010-12345
    # 010
    # 12345

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

    注意到group(0)永远是原始字符串,group(1)group(2)……表示第1、2、……个子串。

    t = '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])$', t)
    print(m.groups())

    #输出:
    # ('19', '05', '30')

    2.贪心匹配

    print(re.match(r'^(d+)(0*)$', '102300').groups())
    # ('102300', '')
    print(re.match(r'^(d+?)(0*)$', '102300').groups())
    # ('1023', '00')

    由于d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串,加个?就可以让d+采用非贪婪匹配;

    3.编译

    如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式

    # 编译
    tele = re.compile(r'^(d{3})-(d{3,8})$')
    # 使用:
    print(tele.match('010-12345').groups())
    # ('010', '12345')
    print(tele.match('010-8086').groups())
    # ('010', '8086')
    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    线性表——(2)单向链表
    线性表——(1)顺序表
    UVa 1592 数据库
    UVa 12096 集合栈计算机
    Python 协程
    Python 多线程及进程
    Python 日志(Log)
    Python 函数式编程
    Python基础
    DB2 获取前两天的数据
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/8934491.html
Copyright © 2011-2022 走看看