zoukankan      html  css  js  c++  java
  • python之路_正则表达式及re模块

    一、正则表达式

      匹配字符串内容的一种规则。

    1、字符组概念

      在同一个位置可能出现的各种字符组成一个字符组,在正则表达式中用[]表示。常见字符组格式如下:[0123456789],[0-9],[a-z],[A-Z],必须由从小到大,不可逆序。

    2、主要元字符

    元字符 匹配内容 元字符 匹配内容
    . 匹配出换行符以外所有字符 $ 匹配一个字符串的结束
    w 匹配数字或字母或下划线 W 匹配非字母或数字或下划线
    d 匹配数字 D 匹配非数字
    s 匹配任意空白符 S 匹配非空白符
    匹配换行符 a|b 匹配字符a或字符b
    匹配制表符 () 匹配括号内的表达式,也表示一个组
     匹配一个单词的结尾 [...] 匹配字符组中的所有的字符
    ^ 匹配一个字符串的开始 [^...] 匹配除了字符组中所有的字符的字符
    #.^$实例:
    import re
    obj1=re.findall('海.','海燕海娇海东')   
    print(obj1)                                 #输出结果为:['海燕', '海娇', '海东'],匹配所有带‘海’的字符
    obj2=re.findall('^海.','海燕海娇海东') 
    print(obj2)                                 #输出结果为:['海燕'],只从开头匹配带海的字符
    obj3=re.findall('海.$','海燕海娇海东') 
    print(obj3)                                 #输出结果为:['海东'],只匹配结尾带海的字符

    3、主要量词

      由于贪婪匹配的原因,在满足匹配条件的情况下,默认按贪婪匹配,即尽可能多的匹配字符串,若在量词后面加上?,即可将贪婪匹配更改为非贪婪匹配,即匹配尽量短的字符串,常见量词及其主要用法如下:

    量词 用法说明 量词 用法说明
    * 重复零次或多次 {n} 重复n次
    + 重复一次或多次 {n,} 重复n次或多次
    重复零次或一次 {n,m} 重复n到m次
    #* + ? { }实例:
    import re
    obj1=re.findall('李.?','李杰和李莲英和李二棍子')
    print(obj1)                                             #['李杰', '李莲', '李二'],?表示匹配0或者1次,即匹配李后面任意字符1次
    obj2=re.findall('李.*','李杰和李莲英和李二棍子')
    print(obj2)                                             #['李杰和李莲英和李二棍子'],*表示匹配0次或者多次,即匹配李后面任意字符多次
    obj3=re.findall('李.+','李杰和李莲英和李二棍子')
    print(obj3)                                             #['李杰和李莲英和李二棍子'],+表示匹配1次或者多次,即匹配李后面任意字符多次
    obj3=re.findall('李.{1,2}','李杰和李莲英和李二棍子')
    print(obj3)                                             #['李杰和', '李莲英', '李二棍'],{1,2}表示匹配1到2次,即匹配李后面任意字符2次

      以上量词非贪婪模式为:

    非贪婪模式 用法说明
    *? 
    重复0次或更多次,但尽可能少重复
    +?
    重复1次或更多次,但尽可能少重复
    ?? 
    重复0次或1次,但尽可能少重复
    {n,}?
    重复n次以上,但尽可能少重复
    {n,m}?
    重复n到m次,但尽可能少重复
    import re
    obj1=re.findall('李.??','李杰和李莲英和李二棍子')
    print(obj1)                                             #输出结果:['李', '李', '李']
    obj2=re.findall('李.*?','李杰和李莲英和李二棍子')
    print(obj2)                                             #输出结果:['李', '李', '李']
    obj3=re.findall('李.+?','李杰和李莲英和李二棍子')
    print(obj3)                                             #输出结果:['李杰', '李莲', '李二']
    obj3=re.findall('李.{1,2}?','李杰和李莲英和李二棍子')
    print(obj3)                                             #输出结果:['李杰', '李莲', '李二']

    4、字符集[]和[^]

    import re
    obj1=re.findall('李.[杰莲英二棍子]*','李杰和李莲英和李二棍子')
    print(obj1)                                             #输出结果:['李杰', '李莲英', '李二棍子']
    obj2=re.findall('李.[^和]*','李杰和李莲英和李二棍子')
    print(obj2)                                             #输出结果:['李杰', '李莲英', '李二棍子'],表示匹配李后面不是和的任意字符
    obj3=re.findall('[d]','456bdha3')
    print(obj3)                                             #输出结果:['4', '5', '6', '3'],表示匹配任意一个数字
    obj3=re.findall('[d]+','456bdha3')
    print(obj3)                                             #输出结果:['456', '3'],表示匹配任意个数字

     5、分组()与或|

      身份证号码是由15位或者18位的字符组成,如果是15位,首位不能是0,其他位数均为数字,如果是18位,则最后一位可能是数字或者X,用正则表达式匹配的两种方式如下:

    正则表达式 结果说明
    ^[1-9]d{14}(d{2}[0-9x])?$
    ()表示分组,将d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
    ^([1-9]d{16}[0-9x]|[1-9]d{14})$
    表示先匹配[1-9]d{16}[0-9x]如果没有匹配上就匹配[1-9]d{14}

    二、re模块主要方法

    1、findall():返回所有符合匹配条件的结果,放进列表中。

    import re
    ret = re.findall('a', 'eva egon yuan') 
    print(ret)                           #结果 : ['a', 'a']

    2、search():在字符串内进行匹配,直到找到第一个后,返回一个包含匹配信息的匹配对象,可以通过group()对匹配对象取出匹配的字符串,如果没有匹配的字符串,则返回None,通过group()取值会报错 。

    import re
    ret = re.search('a', 'eva egon yuan').group()
    print(ret)                           #结果 : 'a'

    3、match():在字符串开头进行匹配,返回一个包含匹配信息的匹配对象,可以通过group()方法调用匹配对象,取出匹配的字符串,如果没有匹配的字符串,则返回None,通过group()取值会报错。

    import re
    ret = re.match('h', 'abc')
    print(ret)                           #返回None
    res = re.match('a', 'abc')
    print(res.group())                  #返回‘a'

    4、split():按照正则表达式的要求对字符串分割,返回分割后的列表

    import re
    ret=re.split('[ab]','abcd')         #先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    print(ret)                          #结果:['', '', 'cd']

    5、sub():替换字符串中的内容,与字符串方法replace()相似

    import re
    ret=re.sub('d','H','av23nb4g4',2)  #将字符串中的数字替换为'H’,其中2代表只替换前两个,默认全部替换
    print(ret)                          #输出结果:avHHnb4g4

    6、subn()替换字符串中的内容,返回一个元组,包含替换结果的字符串及替换次数

    import re
    ret=re.subn('d','H','av23nb4g4')
    print(ret)                          #输出结果:('avHHnbHgH', 4)

      

      

  • 相关阅读:
    【做题记录】区间排序—线段树
    【做题记录】CF1428E Carrots for Rabbits—堆的妙用
    线段树合并、分裂
    一、drf入门规范
    七、Django实战--图书管理系统搭建
    六、ORM模型层补充
    五、Django之模型层
    四、Django之模板层
    三、Django之视图层
    二、Django之路由层
  • 原文地址:https://www.cnblogs.com/seven-007/p/7506928.html
Copyright © 2011-2022 走看看