zoukankan      html  css  js  c++  java
  • 正则表达式:内置re模块

    正则表达式:
     正则表达式本身是一种小型的,高度专业化的编程语言,在python中,通过内嵌集成re模块
     可以直接调用来实现正则匹配。
     动态的模糊匹配,存在一定的条件

     例1:
     import re
     res = re.match("^Chen", "Chen321RongHua")   #^匹配以Chen开头;
     res1 = re.match("^Chend", "Chen321RongHua")  #^匹配以Chen开头,d其后为数字;
     res2 = re.match("^Chend+", "Chen321RongHua")  #^匹配以Chen开头,d其后为数字, +代表一个或多个;
     print(res.group())
     print(res1.group())
     print(res2.group()) 
     
     输出:
     Chen
     Chen3
     Chen321
     
     
     功能函数:
     1. re.compile()
      编译正则表达式模式,返回一个对象模式;
      可以把那些常用的正则表达式编译成正则表达式对象,提高一点效率;
      
      格式:
      re.complile(pattern, flags=0)
      
      pattern: 编译时用的表达式字符串;
      flags:  编译标志位,用于修正表达式的匹配方式,如:是否区分大小写,多行匹配等。
      
      常用的flags有:
      re.S(DOTALL):   使 . 匹配包括换行在内的所有字符;
      re.I(IgnoreCase):  使匹配对大小写不敏感,即或略大小写
      re.L(Locale):   做本地化识别(local-aware)匹配。
      re.M(Multiline):  多行匹配,影响^和$
      re.X(Verbose):   该标志通过给与更灵活的格式以便将正则表达式写得更易于理解;
      re.U:     根据Unicode字符集解析字符,这个标志影响w,W,,B
      
      
      案例:
       import re
       tt = "This is a good girl, she is cool,clever, and so on....."
       rr = re.compile(r"w*oow*")
       print(rr.findall(tt))
      
       输出:['good', 'cool']
      
       "w"  匹配包括下划线在内的任何字符: [A-Za-z0-9_]
       "*"   匹配前一个字符0次或多次
      
       import re
       tt = "This is a gOod girl, she is cool,clever, and so on....."
       rr = re.compile(r"w*oow*", re.I)
       print(rr.findall(tt))
       
       输出:['gOod', 'cool']
       
       re.I(IgnoreCase):  使匹配对大小写不敏感,即或略大小写
       
     2. re.match()   
      从字符串的开头开始匹配,返回第一个匹配的;
      
      决定re是否在字符串刚开始的位置匹配,这个方法并不是完全匹配,当pattern结束时
      若string还有剩余字符,仍然视为成功,要想完全匹配,可以在表达式末尾加上边界匹配符号"$"
      
      格式:
      re.match(pattern, string,flags)
     
      案例:
       print(re.match("com", "com www.baidu.com, www.test.Com").group())
       print(re.match("com", "com www.baidu.com", re.I).group())
       print(re.match(".*com", "www.baidu.com, www.test.Com").group())
       
       输出:
       com
       com
       www.baidu.com
       
      一定时要从开头开始起匹配,否则匹配不上
       
       
     3. re.search()   
      
      从字符串的任意位置开始匹配,返回第一个匹配的;
      函数会在字符串内查找模式匹配,只要找到第一个匹配后就返回,如果字符串没有匹配,则返回None
      
      格式:
      re.search(pattern, string,flags)
      
      案例:
      print(re.search("com", "www.baidu.com, www.test.Com").group())
      print(re.search("com", "om www.baidu.Com", re.I).group())
     
      输出:
      com
      Com
     
      备注:
      match和search一旦匹配成功,就是一个match object对象,就以下方法:
      
      group():  返回被re匹配的字符串;
      start():  返回匹配的开始位置;
      end():   返回匹配的结束位置;
      span():   返回一个元组包含开始,结束的位置
      groups():  返回re整体匹配字符串,可以一次输入多个组号,对应的组号匹配的字符串
      
      案例:
      
      tt = "123abc456"
      print(re.search("([0-9]*)([a-z]*)([0-9]*)", tt).group(0))
      print(re.search("([0-9]*)([a-z]*)([0-9]*)", tt).group(1))
      print(re.search("([0-9]*)([a-z]*)([0-9]*)", tt).group(2))
      print(re.search("([0-9]*)([a-z]*)([0-9]*)", tt).group(3))
      
      输出:
      123abc456
      123
      abc
      456
      
     4. re.findall()   
      从字符串的任意位置开始匹配,返回所有匹配的; 没有group方法。
      
      遍历匹配,可以获得字符串中所有的匹配的字符串,返回一个列表
     
      格式:
      re.findall(pattern, string,flags)
     
      案例:
      import re
      tt = "This is a gOod girl, she is cool,clever, and so on....."
      rr = re.compile(r"w*oow*", re.I)
      print(rr.findall(tt))
     
      输出:
      ['gOod', 'cool']
     
     5. re.split()
      按照能够匹配的字符串将string分割后返回列表;
      
      格式:
      re.split(pattern,string[,maxsplit])
      maxsplit 用于指定最大的分割次数,不指定全部分割
      
      
      例如:
      re.split(r"S+", string)    将字符串按照空格分割一个单词列表
      
      
      tt = "This is a gOod girl, she is cool,clever, and so on"
      print(re.split(r"s+", tt))
      
      输出:
      ['This', 'is', 'a', 'gOod', 'girl,', 'she', 'is', 'cool,clever,', 'and', 'so', 'on']
      
      
      案例:
      >>> re.split("[0-9]", "abc12efg98sdsd343ksd")
      ['abc', '', 'efg', '', 'sdsd', '', '', 'ksd']
      >>>
      >>> re.split("[0-9]+", "abc12efg98sdsd343ksd")
      ['abc', 'efg', 'sdsd', 'ksd']
      >>>
      
      expr = "3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)"
      >>> re.split(r"(([^()]+))", expr,1)
      ['3*', ' 4+ 50 ', '-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)']
     
     6. re.sub():
        使用re替换string中每一个匹配的字符串后返回匹配的字符串
      
      格式:
      
      re.sub(pattern, string, count)
      
      案例:
      >>> re.sub("[0-9]+", "|", "abc12ded87sds40hsd")
      'abc|ded|sds|hsd'
      >>>
      
      >>> re.sub("[0-9]+", "|", "abc12ded87sds40hsd", count=2)  #count表示需要替换的个数,不写表示替换所有
      'abc|ded|sds40hsd'
      >>>
     
     
     
     
     常规的正则表达式符号: 
     1. "."   匹配任意除换行符" "外的字符(在DOTALL模式中也能匹配换行符);
        >>> re.search("R.+Hua", "Chen321RongHua123").group()
        'RongHua'
        >>> re.search("R[a-zA-Z]+a", "Chen321RongHua123").group()
        'RongHua'
        >>>
        >>> re.search("R[a-zA-Z]+a", "Chen321RongHua123RongHua").group()
        'RongHua'
        
        [0-9]   #表示任何数字
        [a-z]   #表示匹配任意小写字母;
        [A-Z]   #表示匹配任意大写字母;
        [a-zA-Z]  #表示匹配任意大小写字母;
       
     2. "^"  匹配字符串开头, 在多行模式中匹配每一行的开头;
     3. "$"  匹配字符串末尾,在多行模式中匹配每一行的末尾
     4. "*"  匹配前一个字符0次或多次
        >>> re.search("hhh*", "hhello#1212")     #至少匹配”hh"
        <_sre.SRE_Match object; span=(0, 2), match='hh'>
        >>> 
     5. "+"  匹配前一个字符1次或无限次
     6. "?"  匹配前一个字符0次或1次
        >>> re.search("hhh?", "hhello#1212")     #至少匹配”hh"
        <_sre.SRE_Match object; span=(0, 2), match='hh'>
        >>>
     7. "{m}" 匹配前一个字符m次,
        >>> re.search("l{2}", "hhello#1212")
        <_sre.SRE_Match object; span=(3, 5), match='ll'>
        
        >>> re.search("[0-9]{3}", "hhello#1212")
        <_sre.SRE_Match object; span=(7, 10), match='121'>
        >>>
        >>> re.search("[0-9]{4}", "hhello#1212")
        <_sre.SRE_Match object; span=(7, 11), match='1212'>
        >>> re.search("[0-9]{2}", "hhello#1212")
        <_sre.SRE_Match object; span=(7, 9), match='12'>
        >>>
           
     8. {m,n} 匹配前一个字符m至n次,若省略n,则匹配m至无限次
     
        >>> re.search("[0-9]{2,3}", "hhello#1212")
        <_sre.SRE_Match object; span=(7, 10), match='121'>
        >>>
        >>> re.search("[0-9]{4,5}", "hhello#1212")
        <_sre.SRE_Match object; span=(7, 11), match='1212'>
        >>>
        >>> re.search("[0-9]{5,6}", "hhello#1212")
        >>>
        >>>
        >>> re.search("[0-9]{2,3}", "hhello#12")
        <_sre.SRE_Match object; span=(7, 9), match='12'>
        >>>
     
        >>> re.search("[0-9]{2,3}", "hhe2w3l3lo#12")
        <_sre.SRE_Match object; span=(11, 13), match='12'>
        >>>
        >>>
        >>> re.findall("[0-9]{2,3}", "hhe2w3l3lo#12")
        ['12']
        >>> re.findall("[0-9]{1,3}", "hhe2w3l3lo#12")
        ['2', '3', '3', '12']
        >>>
     
     9. "|"  或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式
        >>> re.search("abc|ABC", "hhabce2w3l3lABCo#12")
        <_sre.SRE_Match object; span=(2, 5), match='abc'>
        >>>
        >>> re.findall("abc|ABC", "hhabce2w3l3lABCo#12")
        ['abc', 'ABC']
        >>>
        
     10. "(...)" 分组匹配。
        >>> re.search("(abc){2}", "hhabcabc2w3l3lABCo#12abc")    #匹配字符串abc的匹配次数
        <_sre.SRE_Match object; span=(2, 8), match='abcabc'>
        
        >>> re.search("abc{2}", "hhabcabcccccabc2w3l3lABCo#12abc")   #只是匹配c匹配次数
        <_sre.SRE_Match object; span=(5, 9), match='abcc'>
        
        >>> re.search("(||){2}", "hhabcabc2w3l3lABCo#12||||abc||")
        <_sre.SRE_Match object; span=(21, 25), match='||||'>
     
     11. ""  转义字符,使后一个字符改变原来的意思
     
      "A"  只匹配字符串开头,  同^
      ""  只匹配字符串结尾,  同$
          >>> re.search("Ahh.+||", "hhabcabc2w3l3lABCo#12||abc||")
          <_sre.SRE_Match object; span=(0, 28), match='hhabcabc2w3l3lABCo#12||abc||'>
      "d"  匹配数字:       [0-9]
      "D"  匹配非数字:      [^0-9]    
      "w"  匹配包括下划线在内的任何字符: [A-Za-z0-9_]
      "W"  匹配非字母字符,即匹配特殊字符 [^A-Za-z0-9_]
      "s"  匹配任何空白字符:    <空格> , , ,f,v
      "S"  匹配非空白字符:    [^s]
     
     
     
     
     12. 正则表达式中中括号中可以表示
      1. 某个区间内 如 [a-zA-Z0-9]
      2. 某几个的范围 [abcd]
      3. 可以在中括号中进行取非的操作. [^a]
      4. 在中括号中的字符不再有特殊的含义  如经常匹配全部的 .和*  [.][*]
     
     
     
      >>> re.search("(?P<id>[0-9])","abcd1212sdsd121#we")
      <_sre.SRE_Match object; span=(4, 5), match='1'>
      >>>
      >>> re.search("(?P<id>[0-9])","abcd1212sdsd121#we").group()
      '1'
      >>> re.search("(?P<id>[0-9]+)","abcd1212sdsd121#we").group()
      '1212'
      >>> re.search("(?P<id>[0-9]+)","abcd1212sdsd121#we").groupdict()
      {'id': '1212'}
      >>>
      >>> re.search("(?P<id>[0-9]+(?P<name>[a-zA-Z]+))","abcd1212sdsd121#we").groupdict()
      {'id': '1212sdsd', 'name': 'sdsd'}
      >>>
      >>> re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birth>[0-9]{8})", "362822198509160042").groupdict()
      {'province': '3628', 'city': '22', 'birth': '19850916'}
      >>>
      
      
     匹配: (需要用r且加转义)
      >>> re.search(r"\", "abcss12sd08999aas")
      <_sre.SRE_Match object; span=(3, 4), match='\'>
      >>>
      >>>
      >>> re.search(r"\", "abcss12sd08999\aas")
      <_sre.SRE_Match object; span=(3, 4), match='\'>
      >>>
      >>>
      >>> re.search(r"\", "abc\ss12sd08999\aas")
      <_sre.SRE_Match object; span=(3, 4), match='\'>
      >>>
      
     
     匹配忽略大小写:(flags = re.I) 
      >>> re.search("[a-z]+", "abcss12sd08999aas", flags=re.I)
      <_sre.SRE_Match object; span=(0, 3), match='abc'>
      >>> re.search("[a-z]+", "abcss12sd08999aas", flags=re.I).group()
      'abc'
      >>>
      >>> re.search("[a-z]+", "aBcCss12sd08999aas", flags=re.I)
      <_sre.SRE_Match object; span=(0, 3), match='aBc'>
      >>>
      
     
     匹配多行模式:(re.M),改变"^"和"$"的行为;
      >>> re.search(r"^a", " abc eeee")
      >>>
      >>>
      >>> re.search(r"^a", " abc eeee",flags=re.M)
      <_sre.SRE_Match object; span=(1, 2), match='a'>
      >>>
      >>> 
      
     点任意匹配模式,改变"."的行为,re.S
     
     
    解释一下:
    1.正则匹配串前加了r就是为了使得里面的特殊符号不用写反斜杠了。
    2.[ ]具有去特殊符号的作用,也就是说[(]里的(只是平凡的括号
  • 相关阅读:
    【代码笔记】iOS-书架页面
    iOS-@inerface的11条规范写法
    (转)iOS-蓝牙学习资源博文收集
    iOS App启动图不显示的解决办法.
    理解点击屏幕的事件响应--->对- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法的理解
    理解点击屏幕的事件响应--->对UIView的hitTest: withEvent: 方法的理解
    iOS GCD中级篇
    iOS开发UI篇—自定义layer
    iOS开发UI篇—CALayer
    iOS-绘制图层-CALayer的属性
  • 原文地址:https://www.cnblogs.com/brace2011/p/9226384.html
Copyright © 2011-2022 走看看