正则表达式 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)

  

       
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/sun-ming-ji/p/9438025.html