• 正则表达式 re模块


    正则表达式:    (是一种独立的语法,与python语言没有关系)
        定义:   一种匹配字符串的规则
        正则表达式的应用:
            可以定制一个规则:
                1.确定/判断某个字符串是否符合规则
                2.在一大段字符串中找到符合规则的内容
            程序领域:
                1.登陆注册网页的表单 验证 web开发
                2.爬虫,把网页的源码下载下来,做数据分析
                3.自动化开发, 日志分析
           帮助学习的测试工具 http://tool.chinaz.com/regex/ 站长工具
     
        元字符 
            d ==        [0-9]                匹配的是一个数字
            w ==        [0-9a-zA-Z_]   匹配的是字母数字下划线
            s  ==        [ 空格]      匹配回车 空格 制表符"Tab"
     
            D                                    匹配非数字
            W                                   匹配回车 空格 制表符
            S                                     匹配非空白
            
            [dD], [sS], [wW]          匹配所有类型字符串
            
            ^                                      判断是否是字符串开头,后面跟上要识别的内容
            $                                      判断是否是结尾,前面跟上内容
            a|b                                    匹配 | 两端的字符a 或者字符b 
             .                                      匹配除了换行符以外的任意字符  (ps: 在爬虫中用的比较多)
            ()                                      分组,可以约束一组字符串
            字符组 [ ]
                在一个字符的位置上能出现的内容
                例: [1cd] 是个范围, 代表这个位置的字符可以是1,c,d 中的任意一个
                [0-9][A-Z][a-z]    匹配三个字符
                [2-7abc]              匹配一个字符, 可以是2-7中的任意数字或者a,b,c中一个
                [0-9A-Za-z]        匹配一个字符
            ps: 匹配过程:从头开始匹配一个字符串,匹配到多少个,就返回多少条结果
        
        量词:
            ?                      匹配前一个字符0次或1次, 可有可无
            +                     匹配前一个字符多次或一次
            *                      匹配前一个字符0次或多次,  ?与+拼在一起
           {n}                     匹配前一个字符重复n次
           {n, }                   匹配前一个字符n+次, n次或更多次
           {n,m}                 匹配前一个字符重复n至m次
     
       
         贪婪匹配:(正则表达式的默认匹配规则, 用的回溯算法) 在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
         仅带有*,+等都是贪婪匹配,也就是尽可能匹配,量词的后面加  ? 号使其变成惰性匹配
        几种常用的非贪婪匹配:(惰性匹配)
            *? 重复任意次,但尽可能少重复
            +? 重复1次或更多次,但尽可能少重复
            ?? 重复0次或1次,但尽可能少重复
            {n,m}? 重复n到m次,但尽可能少重复
            {n,}? 重复n次以上,但尽可能少重复
     
          训练:
            <.*>
            <.*?>
            .^$        
            *+?{}     
            [ ] 
            分组()?与   或 | [^]
     
    re模块
        介绍:正则表达式内置在python中,需要用re模块调用出来
        pattern......匹配的正则表达式
        string.......要匹配的字符串。
         flags......标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
         RegexObject 正则表达式对象
        常用匹配方法:
            1. re.findall(pattern,string,flags=0)  *****
                把匹配到的字符以列表的形式返回
            2. re.search(pattern,string,flags=0)    *****
                在string中寻找模式,仅返回一个值
            3. re.match(pattern,string,flags=0)    **
                在string的开始处匹配模式    
                
            4. re.sub(pattern, repl, string, count=0, flags=0)    ***
                匹配字符并替换并可以控制替换次数
            5. re.subn(pattern, repl, string, count=0, flags=0) ***
                匹配字符并替换,可以控制替换次数,打印时会返回替换次数
            6. re.split(pattern,string,maxsplit=0,flags=0)    ***
                匹配到的字符被当作列表的切割符,返回一个列表
            
            7. re.compile(pattern)    *****  (可以提高时间效率)
                根据包含正则表达式的字符串 创建一个RegexObject,可以通过RegexObject进行re方法操作
            8. re.finditer(pattern)  *****  (可以提高空间效率)
                返回一个迭代器  (用for循环迭代)
                
        常用方法:
            group()  获取一个或者多个分组匹配的字符串
            groups() 获取全部分组的匹配的结果 放在一个元组里,可以只打印索引的结果
                
        转义符        
            应用场景:假如匹配的文本中有"",在正则表达式中就需要有"\\"
            在python中有更简单的方法,在pattern或str前面加上 r 就代表转义
        
        其他匹配模式:
            re.I
                忽略大小写
            re.M
                多行模式
            re.S
                点 任意模式
        分组() 的应用:
            在re.findall  中会优先显示分组中的内容, 想要取消分组内容优先,需要声明(?:pattern)
            在re.split  中会保留切割符(被切掉的内容)
            在re.search  如果有多个分组的pattern时,通过group(n)可以拿到索引对应的匹配到的内容
    ret=re.findall(r"d+(?:.d+)|(d+)","1-2*(60+(-40.35/5)-(-4*3))")  #显示所有整数
    print(ret) #['1', '2', '60', '', '5', '4', '3']
         正表达式进阶:
             分组命名:
                (?P<name>pattern) 表示给分组起名字
                (?P=name) 表示使用这个分组,匹配到的内容ing该和分组中的内容完全相同 , 通常跟在(?P<name>pattern)的后面使用  
    标签匹配:
    ret = re.search("<(?P<name>w+)>w+</(?P=name)>","<h1>hello</h1>")
    print(ret.group('name')) #结果 :h1
    print(ret.group()) #结果 :<h1>hello</h1>
          
    ret = re.search(r'<(w+)>(w+)</(w+)>',r'<a>wahaha</b>')
    print(ret.group()) #<a>wahaha</b>
    print(ret.group(1)) #a
    print(ret.group(2)) #wahaha
    print(ret.group(3)) #b
    ret = re.search(r'<(?P<tag>w+)>(?P<c>w+)</(w+)>',r'<a>wahaha</b>')
    print(ret.group()) #<a>wahaha</b>
    print(ret.group('tag')) #a
    print(ret.group('c')) #wahaha
    

      

     
     
        练习:
    import re
    st= re.findall('d+',"adfhauo14145")
    print(st)
    st1 = re.search('d+',"adfhauo14145")
    if st1:print(st1.group())
    st2 = re.match("d+","1414adfhauo14145")
    if st2:print(st2.group())
    its = re.subn('d','w','afajfj134jh41432')
    print(its)
    its1 = re.finditer('d+','agfg14414ggh4gh1g4h1g4h1g4h1g4hg')
    for r in its1:
    print(r.group())
    its3 = re.compile('d+')
    f = its3.finditer("fhagf245jh21443")
    for r in f:print(r.group())
    f1 = re.split("(d)","ahfv3142bhbh25hb5h2v5")
    print(f1)
    

      

           
        
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Linux中将两块新硬盘合并成一个,挂载到/data目录下
    linux将硬盘格式化为xfs文件系统
    nginx配置文件
    centos 添加新硬盘,lvm对根目录扩容
    centos7重新调整分区大小
    Linux 一种调用蜂鸣器的方法
    mybatis中 keyProperty="id" 的作用
    MySQL实战45讲
    常用正则表达式最强整理(速查手册)
    linux下nacos的1.1.3版本集群部署
  • 原文地址:https://www.cnblogs.com/sun-ming-ji/p/9438025.html
Copyright © 2020-2023  润新知