zoukankan      html  css  js  c++  java
  • Python-正则零宽断言及命名捕获(类PHP)

    (一)零宽断言

     说明:本文的例子使用python描述
          首先说明一下什么是零宽断言,所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置。
          正则表达式中有很多这样的断言,常见的如匹配字符串或者行的起始位置 ^ 和 /A,匹配字符串或者行的末尾 $ 和 /Z,单词边界/B等等。这些简单的就不说了,今天主要说一下界定的使用方法(有些资料叫环式结构,名字而已,不重要)。界定也是一种零宽断言,界定主要有四类:
          1、前向界定(肯定顺序环视)(?=exp)
          表示右边要匹配exp表达式

    strTest = "aaa111aaa , bbb222&, 333ccc"  
    
    strRe = r"d+(?=[a-z]+)"  
    reObj = re.compile(strRe)  
    
    print reObj.findall(strTest)  

          输出:(正则的意思是找出连续的数字并且最后一个数字跟着至少一个a-z里面的字符序列)

    ['111', '333']

          2、前向否定界定(否定顺序环视)(?!exp)
          表示右边不匹配exp表达式

    strTest = "aaa111aaa , bbb222&, 333ccc"  
    
    strRe = r"d+(?![a-z]+)"  
    reObj = re.compile(strRe)  
    
    print reObj.findall(strTest)  

          输出:(正则的意思是找出连续的数字,并且最后一个数字后面不能跟任何一个a-z里面的字符序列)

    ['11', '222', '33'] 

          3、反向界定(肯定逆序环视)(?<=exp)文本必须定长
          表示左边要匹配exp表达式

    strTest = "aaa111aaa , bbb222&, 333ccc"
      
    strRe = r"(?<=[a-z])d+"  
    reObj = re.compile(strRe)  
    
    print reObj.findall(strTest)  

          输出:(正则的意思是找出连续的数字,并且第一个数字的前面要是a-z中的一个字符)

    ['111', '222']

          4、反向否定界定(否定逆序环视)(?文本必须定长
          表示左边不要匹配exp表达式

    strTest = "aaa111aaa , bbb222&, 333ccc"  
    
    strRe = r"(?<![a-z])d+" 
    reObj = re.compile(strRe)  
    
    print reObj.findall(strTest)  

          输出:(正则的意思是找出连续的数字,并且第一个数字的前面不能是a-z中的一个字符)

    ['11', '22', '333']  

          这里要注意的一个问题是:在python和Perl中两个反向界定的表达式exp只允许使用定长文本,譬如最后第四个例子,如果正则表达式写成:strRe = r"(?,py解释器会报错:error: look-behind requires fixed-width pattern。

    (二)命名组和无捕获组

          python里面还有一种命名组和无捕获组
    命名组比较牛×,也是python的扩展,能把捕获组向使用字典一样的使用:

    s = 'Tom:9527 , Sharry:0003'
    m = re.match( r'(?Pw+):(?Pd+)' , s)   
    
    print m.group()   
    print m.group(0)  
    print m.group(1)  
    print m.group(2)  
    print m.groups()   
    print m.group("name")   
    print m.group("num")  

      输出

    Tom:9527  
    Tom:9527  
    Tom  
    9527  
    ('Tom', '9527')  
    Tom  
    9527  

      无捕获组的使用也是类似,语法:(?:exp)只是无捕获组匹配exp,但不捕获匹配的文本,也不给这个组分配组号

  • 相关阅读:
    Bert及变种简述
    损失函数
    头条(三面)、新浪(一面)、快手(两面)、bigo(两面)面试
    使用curl出现,curl: /usr/local/lib/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /usr/lib/x86_64-linux-gnu/libcurl.so.4)
    cmake 出现undefined reference to xxx 解决办法
    tensorflow2.0编程规范
    asp.net过滤HTML标签,只保留换行与空格
    除了IE浏览器能识别之外,其他浏览器都不能识别的html写法
    bootstrap按钮加载状态改变
    ASP.NET静态页生成
  • 原文地址:https://www.cnblogs.com/JohnABC/p/5737687.html
Copyright © 2011-2022 走看看