zoukankan      html  css  js  c++  java
  • python-正则基础

    正则表达式,说的简单些,就是一个匹配的功能,在python中,只要引用 re 模块,就能进行正则匹配操作

    一、math匹配

    先来看一个简单的例子

    import re
    re.match(pattern, data_source)     #math为匹配,pattern为需要匹配的对象,data_source为数据源
    

    查看下匹配的结果

    import re
    a = re.match('abc', 'abcdefg')
    b = re.match('abc', 'bcdefg')
    print(a)
    print(b)
    
    -----结果-----
    <_sre.SRE_Match object; span=(0, 3), match='abc'>       #a为匹配到的结果,返回的是一个正则的对象
    None                                                    #b为没匹配到的结果
    

    查看匹配到的具体结果,需要使用group方法:

    import re
    a = re.match('abc', 'abcdefg')
    print(a.group())
    
    -----结果-----
    abc
    

     

    需要注意的是,math只能从字符串开头进行匹配

    import re
    a = re.match('abc', 'aabcdefg')
    if a:
        print('匹配成功')
    else:
        print('匹配失败')
    
    -----结果-----
    匹配失败
    

    在math中除了有group方法查看匹配到的内容外,还有以下几个方法:

    import re
    a = re.match('abc', 'abcdefg')
    print(a.start())                 #查看匹配开始的位置
    print(a.end())                   #查看匹配结束的位置
    print(a.span())                  #查看匹配开始和结束的位置
    
    -----结果-----
    0
    3
    (0, 3)
    

      

    如果想要匹配任意数字,可以这样写:

    import re
    a = re.match('[0-9]', '1234abc')                #[0-9]为匹配任意一个数字
    b = re.match('[0-9]{1,9}', '1234abc')           #[0-9]{1,9}为匹配任意1到9个数字
    print(a.group())
    print(b.group())
    
    -----结果-----
    1
    1234
    

     

    在上面的例子中,我们进行了两次匹配,在匹配的过程中,先需要对匹配的对象进行编译,如果多次匹配时的对象都是相同的,那也会进行多次编辑,这就造成了一定程度上的资源浪费,为了提升匹配效率,我们可以这样写:

    import re
    
    p = re.compile('[0-9]')          #先对匹配对象进行编译
    a = p.match('1234aBc')           #第一次匹配开头为数字
    b = p.match('56abc')             #第二次匹配开头为数字
    print(a.group())
    print(b.group())
    

     

    二、search

    在上文中介绍了math,math是只能从开头进行匹配,如果想从整个字符串的任意位置进行匹配,我们可以使用search:

    import re
    a = re.search('d', 'b1234abc123')     #d为匹配任意十进制数,相当于[0-9]
    print(a.group())
    
    -----结果-----
    1

    需要注意的是,search只要是匹配到了内容,后面的内容就不会进行匹配了

    三、findall

    findall方法能够以列表的形式返回能匹配的子串,看例子:

    import re
    a = re.findall('[0-9]', '1234abc123')
    b = re.findall('[0-9]{0,9}', '1234abc123')      
    c = re.findall('[0-9]{1,9}', '1234abc123')
    print(a)
    print(b)
    print(c)
    
    -----结果-----
    ['1', '2', '3', '4', '1', '2', '3']
    ['1234', '', '', '', '123', '']              #由于{0,9}是可以匹配到0个数字,因此最终的结果中会匹配到空的字符串
    ['1234', '123']                              #改为{1,0}后,就无法匹配到0个数字啦
    

      

    四、sub和subn

    之前介绍的几个方法中,只能查看到匹配的结果,如果我们想把匹配到的内容换成另外的内容,就可以使用sub和subn,就是通常意义上的替换

    import re
    a = re.sub('a', 'z', 'b1234abc123aaa')          #把a换成z
    b = re.subn('a', 'z', 'b1234abc123aaa')
    print(a)
    print(b)
    
    -----结果-----
    b1234zbc123zzz
    ('b1234zbc123zzz', 4)                           #使用subn时,会统计到匹配的次数
    

    如果想要指定替换的次数,可以参入count的参数

    import re
    a = re.sub('a', 'z', 'b1234abc123aaa', count=1)
    b = re.subn('a', 'z', 'b1234abc123aaa', count=1)
    print(a)
    print(b)
    
    -----结果-----
    b1234zbc123aaa
    ('b1234zbc123aaa', 1)
    

    五、split

    split表示在匹配时对字符串进行分割,分割完后存入一个列表中

    import re
    a = re.split('[0-9]', 'xiaohong1xiaosun')
    print(a)
    
    -----结果-----
    ['xiaohong', 'xiaosun']
    

      

     

    六、正则表达式

    元字符说明
    . 代表任意字符
    | 逻辑或操作符
    [ ] 匹配内部的任一字符或子表达式
    [^] 对字符集和取非
    - 定义一个区间
    对下一字符取非(通常是普通变特殊,特殊变普通)
    * 匹配前面的字符或者子表达式0次或多次
    *? 惰性匹配上一个
    + 匹配前一个字符或子表达式一次或多次
    +? 惰性匹配上一个
    ? 匹配前一个字符或子表达式0次或1次重复
    {n} 匹配前一个字符或子表达式
    {m,n} 匹配前一个字符或子表达式至少m次至多n次
    {n,} 匹配前一个字符或者子表达式至少n次
    {n,}? 前一个的惰性匹配
    ^ 匹配字符串的开头
    A 匹配字符串开头
    $ 匹配字符串结束
    [] 退格字符
    c 匹配一个控制字符
    d 匹配任意数字
    D 匹配数字以外的字符
    匹配制表符
    w 匹配任意数字字母下划线
    W 不匹配数字字母下划线
  • 相关阅读:
    微信小程序 WePY 2 框架入门教程
    微信小程序 WePY 1.7.X 框架入门教程
    /deep/ 深度作用选择器作用及使用
    微信小程序 wx.getUserProfile 接口获取用户信息
    Wepy 微信小程序项目踩坑记
    计算机网络-第一章概述OSI参考模型
    如何安装pycocotools为文件?
    第三章 系统总线
    第二章 计算机的发展和展望
    第一章 计算机基础概论
  • 原文地址:https://www.cnblogs.com/nizhihong/p/8058112.html
Copyright © 2011-2022 走看看