zoukankan      html  css  js  c++  java
  • 正则表达式 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)
    

      

           
        
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/sun-ming-ji/p/9438025.html
Copyright © 2011-2022 走看看