20.Python之正则表达式

作者: 免跪姓黄 | 来源:发表于2020-02-22 00:13 被阅读0次

    Python之正则表达式


    1. 正则表达式


      • 什么是正则表达式?

        • 正则表达是一套匹配字符串的通用规则,很多开发语言中都有。


      • 为什么要用正则表达式?

        • 检测一个字符串是否合法。在用户输入一个内容的时候,应该对用户输入的内容做检测,这样才能规避因用户的错误或恶意输入,对程序和服务器造成的资源浪费。多用于在Web项目开发时,用于表单验证。

        • 高效的内容匹配。从一个大文件当中快速的找到所有符合规则的内容。多用于爬虫的日志分析。


      • 正则表达式怎么用?

        正则表达式永远都是从左到右依据规则进行匹配的,正则表达式没有逻辑,只认规则!有逻辑的永远是正则表达式的设计者!


        • 字符组

          字符组是整个正则表达式中描述最细腻的方式,可以精准的匹配到任何内容。

          • []:一个中括号内放入需要匹配的的字符,只要被匹配的字符串内单个字符位置含有中括号里的ASCII字符,就算匹配成功。中括号内可以写一个、多个、一个范围或者多个范围的字符,字符的范围需根据ASCII码值中从小到大,不能从大到小。

            [Python]    # 匹配P,y,t,h,o,n这6个字母,只匹配一个字符位
            [a-z]   # 匹配a到z所有的字母,由于根据ASCII码进行匹配,因此范围需要ACSII码从小到大,不能z-a
            [A-z]   # 匹配A到Z所有的字母
            [0-9]   # 匹配0到9所有的数字
            [0-9a-zA-Z] # 匹配所有大小写字母与数字,可以写多个范围
            

        • 非字符组

          • [^]:一个中括号,第一位是^,表示非字符组。

            [^Python]   # 只要匹配内容中不是P,y,t,h,o,n这6个字母,那个字节位就算匹配成功
            

        • 元字符

          在正则表达式中表示匹配的内容符号(字符组、\d\w\s等)都是元字符。表示能匹配那些内容,一个元字符只能表示一个字符位置上的字符。


          • \d:表示匹配一位任意数字字符,等同于 [0-9]。d表示digit。


          • \w:表示匹配一位任意数字字符、字母和下划线,等同于 [0-9a-zA-Z_]。w表示word。


          • \s:表示匹配一位任意空字符(空格: ,制表符:\t,回车:\n)。


          • \D:表示匹配一位任意非数字字符。


          • \w:表示匹配一位任意非数字、字母和下划线字符。


          • \S:表示匹配一位任意非空白字符。


          • \b:表示以一个单词为边界匹配任意数字、字母和下划线结尾的字符。


          • .:表示匹配一位除换行符以外的任意字符。但可以通过设置使其能够匹配换行符。注意,如果匹配的字符串中含有.比如:www.google.com,那么需要在规则的.之前加上\进行转义:\.,否则.所占的字符位就会匹配除换行符以外的任意字符。


          • [\d\D][\w\W][\d\D]:表示匹配一位任意字符。


          • ^:匹配字符串的开始。注意:^只能出现在开始的位置,且只从字符串的开始位置进行匹配,进行匹配时,空白字符由于看到不,经常会被忽略,所以要格外注意,空白字符也要算上。


          • $:匹配字符串的结尾。注意:$只能出现在结束的位置,且只从字符串的结束位置进行匹配,进行匹配时,空白字符由于看到不,经常会被忽略,所以要格外注意,空白字符也要算上。


          • ^$组合使用:约束了在^&之间的所有字符和字符位,被匹配字符串必须和^ &之间的字符一模一样才算匹配成功。主要用于判断用户输入内容的合法性检查。


          • |:表示“或”,匹配|左右两边的内容,但是要注意,由于正则表达式是从左往右进行的规则匹配,如果左边匹配成功了,就不会再匹配右边,因此左右两边如果有重叠内容,一定要把更长的内容写在左边。


          • ():表示分组,用于约束某一个元字符的作用范围。

            www\.baidu\.com|www\.google\.com
            # 可以写成
            www\.(baidu|google)\.com    # 表示|只在括号内生效
            

        • 量词

          表示一个元字符匹配多少次。单独使用不生效,必须跟在一个元字符的后面,并且只能约束前面的一个元字符。


          • {n}:表示匹配n次。

            # 匹配手机号,要求第1位数字必须以1开头,第2位数字是3到9,必须只能是11位的数字
            1[3-9]\d{9}
            
            # 判断用户输入的手机号是否合法
            ^1[3-9]\d{9}$   # 严格约束^和$之间的内容
            

          • {n,}:表示至少匹配n次。


          • {n,m}:表示至少匹配n次,至多匹配m次。


          • ?:表示匹配0次或1次。等同于:{0,1}。也就是说可以表示某一个位置上的值可出现也可不出现。


          • +:表示1次或多次。等同于:{1,}

            # 匹配一个任意整数:
            \d+
            # 匹配一个任意浮点数:
            \d+\.\d+
            

          • *:表示0次或多次。等同于:{0,},也就是所有。

            # 匹配一个任意整数或浮点数
            \d+(\.\d+)?
            

        • 贪婪匹配

          贪婪匹配的现象表现在量词允许的范围内,会尽量多的匹配内容。例如:{n,m} 正则表达式会匹配m次。

          # 匹配一串数字,当遇到9的时候停止
          \d{1,}9
          17892190915509876554    # 匹配结果:17892190915509
          
          # 为什么匹配到最后一个9才停止呢?其中除了涉及到贪婪匹配,还涉及到了回溯算法。计算机是这样读正则表达式的:看到 \d 就知道要匹配一个任意数字字符,看到 {} 里面有个 1,先读 \d 后面的 1 位,然后又看了个逗号,并且逗号后面什么也没有,就开始一直匹配数字直到没有数字为止,结果又看到了个 9 ,此时开始从数字的末尾往回走找 9 ,找到 9 后匹配完毕,因此找到的就是最后一个 9 ,这,就是回溯算法。
          
          

          .*x:表示匹配任意字符、任意次数,遇到最后一个x才下来。


        • 非贪婪(惰性)匹配

          惰性匹配实在量词后面加上一个?,表示在量词范围内进行最少匹配。例如:{n,m}? 正则表达式会匹配n次。

          \d{1,}?9
          17892190915509876554
          '''
          匹配结果:
          1789
          219
          09
          15509
          '''
          

          .*?x:表示匹配任意字符、任意次数,一旦遇到x就停下来。


        • 转义符

          有特殊意义或功能的字符,需要表达它符号本身的时候,就需要转义。正则表达式中的转义分为两种:

          • \:在表达式中,任何有特殊意义或功能的字符前面加个\都会丧失其特殊意义或功能。
          • []:在字符组中,所有的量词均丧失其特殊意义,变为普通字符,但-在两个数值之间却表示一个范围,在其他位置才表示其本身。

    相关文章

      网友评论

        本文标题:20.Python之正则表达式

        本文链接:https://www.haomeiwen.com/subject/hnjkqhtx.html