python 正则表达式详解

1.使用场景:
        1.-爬数据:爬取某个网站信息
        2.洗数据:清理某个网站的广告信息
        3.验数据:验证手机号等

    2.re模块的使用过程
        1. 导入模块 import re
        2. 验证匹配: ret=re.match("正则表达式","要匹配的字符串")
          re.match("itcast","itcast.cn")
        3. 验证匹配是否成功
            返回值为空,则失败
            返回值不为空,则匹配成功
        4. 取得匹配结果
            ret.group()
    3.匹配命令格式:
        --'.':表示匹配任意一个字符,除\n换行以外
                In [3]: ret = re.match("a.c","aac")
                In [4]: ret
                Out[4]: <_sre.SRE_Match object; span=(0, 3), match='aac'>

        --[] :表示匹配[]中的字符
                In [5]: ret = re.match("速度与激情[0-9]","速度与激情7")
                In [6]: ret
                Out[6]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情7'>
            提示:[^]表示对里面列举的字符取反
                In [11]: ret = re.match("速度与激情[^0-9]","速度与激情p")
                In [12]: ret
                Out[12]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情p'>

        --\d表示匹配数字,即0-9 \表示转义
                In [13]: ret = re.match("速度与激情\d","速度与激情8")
                In [14]: ret
                Out[14]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情8'>

        --\D表示匹配非数字,即不是数字
                ret = re.match("速度与激情\D","速度与激情8")
                In [16]: ret

                In [17]: ret = re.match("速度与激情\D","速度与激情s")
                In [18]: ret
                Out[18]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情s'

        --\s :表示匹配空白,包含空格和tap键,回车和换行\n
                In [44]: ret = re.match("速度与激情\s","速度与激情 ")
                In [45]: ret
                Out[45]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情 '>       

                In [50]: ret = re.match("速度与激情\s","速度与激情\n")
                In [51]: ret
                Out[51]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情\n'>

        --\S:表示匹配非空白
                In [58]: ret = re.match("速度与激情\S","速度与激情S")
                In [59]: ret
                Out[59]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情S'>

        --\w:表示匹配单词字符 即包含(0-9,a-z A-Z,_)数字,小写字母大写字母下划线
                In [60]: ret = re.match("速度与激情\w","速度与激情dd")
                In [61]: ret
                Out[61]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情d'>

                In [62]: ret = re.match("速度与激情\w","速度与激情5")
                In [63]: ret
                Out[63]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情5'>

                In [64]: ret = re.match("速度与激情\w","速度与激情_")
                In [65]: ret
                Out[65]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情_'>

        --\W:表示匹配非单词字符
                In [66]: ret = re.match("速度与激情\W","速度与激情*")
                In [67]: ret
                Out[67]: <_sre.SRE_Match object; span=(0, 6), match='速度与激情*'>

                In [68]: ret = re.match("速度与激情\W","速度与激情0")
                In [69]: ret

        --{m}:匹配前一个字符出现的m次
                ret = re.match("1\d{10}","12222222222")
                In [73]: ret
                Out[73]: <_sre.SRE_Match object; span=(0, 11), match='12222222222'>

        --{m,n}:表示匹配前一个字符出现m到n次
                In [84]: ret = re.match("\d{1,11}","12222222222")
                In [85]: ret
                Out[85]: <_sre.SRE_Match object; span=(0, 11), match='12222222222'>

                In [86]: 
                In [86]: ret = re.match("0\d{2,3}-\d{7,8}","0773-7459765")
                In [87]: ret
                Out[87]: <_sre.SRE_Match object; span=(0, 12), match='0773-7459765'>

        --?:表示前一个字符出现1次或者0次,要么出现一次,要么一次都没有
                In [88]: ret = re.match("0\d{2,3}-?\d{7,8}","0773-7459765")
                In [89]: ret
                Out[89]: <_sre.SRE_Match object; span=(0, 12), match='0773-7459765'>

                In [90]: ret = re.match("0\d{2,3}-?\d{7,8}","07737459765")
                In [91]: ret
                Out[91]: <_sre.SRE_Match object; span=(0, 11), match='07737459765'>

        --*:表示匹配一个字符出现0次或者多次
                In [153]: ret =re.match(".*",connect,re.S)
                In [154]: ret
                Out[154]: <_sre.SRE_Match object; span=(0, 49), match='sfefefgegwgwg\nfbbdbfnyny\nfergagrahbath\nbebatnn>

                In [156]: ret =re.match(".*","sss")
                In [157]: ret
                Out[157]: <_sre.SRE_Match object; span=(0, 3), match='sss'>

                In [158]: ret =re.match(".*","")
                In [159]: ret
                Out[159]: <_sre.SRE_Match object; span=(0, 0), match=''>

        --+:匹配一个字符出现1次或者无限次,即最少有一次
                In [162]: ret =re.match("a+","aaaa")
                In [163]: ret
                Out[163]: <_sre.SRE_Match object; span=(0, 4), match='aaaa'>

                In [164]: ret =re.match("a+","")
                In [165]: ret

        --^:匹配以xxx开头的字符串
                In [169]: ret= re.match('^itcast','itcast.cn')

                In [170]: ret
                Out[170]: <_sre.SRE_Match object; span=(0, 6), match='itcast'>

                In [171]: ret =re.match("^aaassdsd","aaassdsd")

                In [172]: ret
                Out[172]: <_sre.SRE_Match object; span=(0, 8), match='aaassdsd'>
        --$:匹配以xxx结尾的字符串
                In [173]: ret =re.match("aaassdsd$","aaassdsd")
                In [174]: ret
                Out[174]: <_sre.SRE_Match object; span=(0, 8), match='aaassdsd'>

                In [175]: ret =re.match("^1\d{10}$","12345678911")
                In [176]: ret
                Out[176]: <_sre.SRE_Match object; span=(0, 11), match='12345678911'>

    4.匹配分组
        1. | :匹配左右任意一个表达式,相当于或者
            In [177]: ret =re.match("\w{4,20}@163.com$|\w{4,20}@qq.com$","sdssd@qq.com")
            In [178]: ret
            Out[178]: <_sre.SRE_Match object; span=(0, 12), match='sdssd@qq.com'>
        2.(ab):分组
            说明:这里的分组默认情况下一整串都是一个大组,里面再有括号则是第一组,依次下去
                In [181]: ret =re.match("\w{4,20}@(163|qq|126).com$","sdssd@163.com")
                In [182]: ret
                Out[182]: <_sre.SRE_Match object; span=(0, 13), match='sdssd@163.com'>

                In [183]: ret.group(1)
                Out[183]: '163'
                In [184]: ret.group(0)
                Out[184]: 'sdssd@163.com'

                In [185]: ret =re.match("(\w{4,20})@(163|qq|126).com$","sdssd@163.com")
                In [186]: ret
                Out[186]: <_sre.SRE_Match object; span=(0, 13), match='sdssd@163.com'>
                In [187]: ret.group(1)
                Out[187]: 'sdssd'

        3.\.num:引用分组num匹配到的字符串,也就是用括号分组方式获得字符串
                示例:检验html网页语法的合法性 
          语法规则: html双标签必须配对, 比如<h1>dsafagd</h1>

         # 错误的写法,在python中,、\1返回的是一个奇怪的字符
          ret=re.match('<(\w+)>.*</\1>','<h1>dsafagd</h1>')

         #正确的写法,需要对\再进行转义,回到原来的本义  \\1
          ret=re.match('<(\w+)>.*</\\1>','<h1>dsafagd</h1>')

        4. (?P<name>):分组起别名   
        5. (?P=name) : 引用别名为name分组匹配到的字符串
          示例:检验html网页语法的合法性
          语法规则: html双标签必须配对, 比如<body><h1>dsafagd</h1></body>

          1. ret=re.match('<(\w+)><(\w+)>.*</\\2></\\1>','<body><h1>dsafagd</h1></body>')
          2. ret=re.match('<(?P()<p1>\w+)><(?P<p2>\w+)>.*</(?P=p2)></(?P=p1)>','<body><h1>dsafagd</h1></body>') 

    5. re模块的高级用法
        1.re.search(): 查找匹配的数据,匹配到第一个则立即返回,返回的是match对象
            """
            a>re.search()  :查找匹配的数据,匹配到第一个则立即返回,返回的是match对象
                    语法:re.search("正则表达式","查找的字符串或者文本")
                    示例:匹配微信公众号文章阅读的次数
                    文本如下: "本文章阅读次数: 9998次,博客的阅读次数: 50"
            """
            import re


            def main():
                conect = "本文章阅读次数: 9998次,博客的阅读次数: 50"
                ret = re.search("\d+",conect)
                print(ret.group())#9998,匹配到第一个则立即返回

            if __name__ == '__main__':
                main()

        2.re.findall():查找字符串中所有匹配的数据,返回的是列表
            """
            语法:re.findall("正则表达式","查找的字符串或者文本")
            查找字符串中所有匹配的数据,返回的是列表
                    示例:找到本文的所有数字
                    文本如下:"本文章阅读次数: 9998次,博客的阅读次数: 50"
            """

            import re


            def main():
                conect = "本文章阅读次数: 9998次,博客的阅读次数: 50"
                ret = re.findall("\d+",conect)
                print(ret)#9998,查找字符串中所有匹配的数据,返回的是列表

            if __name__ == '__main__':
                main()
        3.re.sub():查找与替换,返回的是替换后的字符
            In [201]: def add (match):
             ...:     strNum = match.group()
             ...:     num=int(strNum)+1
             ...:     return str(num)
             ...: 

            In [202]: ret = re.sub("\d+",add,"本文章阅读次数: 9998次,博客的阅读次数: 50")

            In [203]: ret
            Out[203]: '本文章阅读次数: 9999次,博客的阅读次数: 51'

        4.split:按照规则分离字符串,返回的是分离后的列表
            In [209]: ret = re.split(" ","wang 22 jijjji wddwd:dwdd")
            In [210]: ret
            Out[210]: ['wang', '22', 'jijjji', 'wddwd:dwdd']

            In [211]: ret = re.split(" |:","wang 22 jijjji wddwd:dwdd")
            In [212]: ret
            Out[212]: ['wang', '22', 'jijjji', 'wddwd', 'dwdd']

    6.贪婪与非贪婪
        1.python里数量词默认都是贪婪的,(在少数语言中可能是非贪婪),总是尝试匹配更多的字符,非贪婪相反,总是尝试匹配尽可能少的字符
        2.贪婪与非贪婪的大前提,在满足整体匹配结果的情况下

        3.在”*“,”?“,”+“,”{m,n}“后面加上”?“,使贪婪变成非贪婪

    7.r的作用:
        1.python中字符串前面加上r表示原生字符串
        2.大多数编程语言相同,正则表达式里使用“\”作为转义字符,这可能会造成反斜杠困扰
          所以加r后完美避免了这个问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值