正则表达式中的模式,函数,及使用规则

一、正则表达式转义

    正则中的特殊符号:

               .   *   ?    $  []   {}   ()   |   \      

    正则表达式匹配特殊字符如果需要加 \  表达转义,比如:

                pattern         string

 python         "\\$\\d+"       "$10"       

  raw字串:原始字符串对内容不解释转义,就表达内容原本意义

二、贪婪与非贪婪
贪婪模式:正则表达式的重复匹配总是尽可能多的向后匹配更多内容

          *    +   ?   {m,n} 
          
       非贪婪(懒惰模式):尽可能少的匹配内容                       

       贪婪  -------》非贪婪    *?     +?     ??   {m,n}?            

      e.g.      In [58]: re.findall(r"ab+?","abbbbbbb")
                Out[58]: ['ab']

                In [59]: re.findall(r'ab{3,4}?','abbbbbbbbb')
                Out[59]: ['abbb']

                In [60]: re.findall(r'ab??','abbbbbbb')
                Out[60]: ['a']

三、正则表达式的子组

      可以使用()为正则表达式建立子组,子组可以看作是正则表达式内部操作的一个整体

       *子组是在正则表达式整体匹配到内容的前提下才会发挥作用,他不影响正则表达式整体去匹配目标内容这一原则

          e.g.   In [66]: re.search(r"(ab)+\d+","ababab1213").group()
                  Out[66]: 'ababab1213'


         子组所用:

                  1、作为内部整体可以改变某些元字符的行为

                    e.g.  In [68]: re.search(r"\w+@\w+\.(com|cn)","[email protected]").group()
                          Out[68]: '[email protected]'

                  2、子组在某些操作中可以单独匹配内容

                       e.g.   In [72]: re.search(r"(https|http|ftp)://\S+","https://www.baidu.com").group()
                              Out[72]: 'https://www.baidu.com'

      自组使用注意事项:

           *一个正则表达式中可以有多个子组

            *子组一般由外到内,由左到右称之为第一,第二,第三...子组

            *子组不能重叠,嵌套也不宜过多

四、捕获组和非捕获组

   格式:(?P<name>pattern)
     
     e.g.   In [74]: re.search(r"(?P<dog>ab)cdef","abcdefghti").group('dog')
            Out[74]: 'ab'

    作用:可以通过组名更方便获取某组内容

五、正则表达式设计原则

          1、正确性,能正确匹配到目标内容

          2、排他性,除了要匹配的内容,尽可能不会匹配其他内容

          3、全面性,需要对目标的各种情况考虑,做到不遗漏

六、re模块

      re. regex = compile(pattern,flags = 0)
            功能:生成正则表达式对象
            参数:pattern   正则表达式
                     flags  功能标志位,丰富正则表达式的匹配功能
            返回值:返回正则表达式对象

       re.findall(pattern,string,flags)
             功能:从目标字符串查找正则匹配内容
             参数:pattern   正则表达式
                   string   目标字符串
                   flags   标志位
             返回值:返回匹配到的内容
                          如果正则有子组则只返回子组对应的内容

         regex.findall(string,pos,endpos)
              功能:从目标字符串查找正则匹配内容
              参数:pattern   正则表达式
                    string   目标字符串
                    pos      匹配目标的起始位置
                   endpos    匹配目标的终止位置
              返回值:返回匹配到的内容
                          如果正则有子组则只返回子组对应的内容

      
          re.split(pattern,string,flags = 0)
               功能:根据匹配内容切割字符串
               参数:pattern    string   flags(同上)
               返回值:返回列表,列表中为切割的内容    

           re.sub(pattern,replaceStr,string,max,flags)
                功能:替换正则匹配到的目标子串部分
                参数:pattern
                          replaceStr   要替换的内容
                          string(同上)
                          max    最多替换几处  默认全部替换
                         flags(同上)
                返回值:返回替换后的字符串               

          re.subn(pattern,replaceStr,string,max,flags)
                功能:替换正则匹配到的目标子串部分
                 参数:pattern
                         replaceStr   要替换的内容
                         string(同上)
                         max    最多替换几处  默认全部替换
                         flags(同上)
                 返回值:返回一个元组,为实际替换了几处和替换后的字符串

          re.finditer(pattern,string,flags)
                功能:使用正则表达式匹配目标字符串
                参数:pattern   string   flags(同上)
                返回值:返回一个迭代对象,迭代到的内容是一个match对象        

          fullmatch()
                功能:完全匹配目标字符串
                参数:pattern,string,flags
                返回值:返回匹配到的match对象,如果没有匹配成功返回None 

           match(pattern,string,flags)
                功能:从开头位置匹配目标字符串
                参数:pattern,string,flags
                返回值:返回匹配到的match对象,如果没有匹配成功返回None

         search(pattern,string,flags)
                功能:从开头位置匹配目标字符串
                参数:pattern,string,flags
                返回值:返回匹配到的match对象,如果没有匹配成功返回None
 

  compile对象属性:
             flags:标志位
             pattern:正则表达式
             groups:有多少子组
             groupindex:捕获组形成组名和序列号的字典,组名为键,序列号为值

猜你喜欢

转载自blog.csdn.net/extremelove520/article/details/83755742