学习提升PythonPython全栈

20.Python之正则表达式

2020-02-22  本文已影响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就停下来。


      • 转义符

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

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

猜你喜欢

热点阅读