20.Python之正则表达式

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就停下来。


      • 转义符

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

        • \:在表达式中,任何有特殊意义或功能的字符前面加个\都会丧失其特殊意义或功能。
        • []:在字符组中,所有的量词均丧失其特殊意义,变为普通字符,但-在两个数值之间却表示一个范围,在其他位置才表示其本身。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容