正则表达式

定义+特点

  • 什么是正则表达式:一套用于匹配字符串的规则
  • 正则表达式测试网站(http://tool.chinaz.com/regex/)
  • 能做什么:
    • 用户输入内容的时候,我们可以提前检测输入是否符合规则(如登录)

      • 能够提升程序的效率以及减轻服务器的压力
    • 能够高效快速地从一大段文字中找到符合规则的内容
      • 从大文件中找到符合规则的字符串(如日志分析/爬虫)
  • 正则规则
    • 用于从获取到的字符串提取符合定义规则的字符串内容

元字符

  • 在正则表达式中能帮助我们表示匹配的内容的符号就是正则中的元字符

    • [ ] : 字符组(描述的是一个位置上能出现的可能性) 与[ ^ ]:非字符组

      • [abc]一个字符组只表示一个字符的位置:匹配a/b/c
      • [0 - 9] 根据ascii的顺序进行范围比对的
      • [a -z] [A-Z] [a-zA-Z] [0-9a-zA-Z]
      • [_\t\n] 匹配到(空格,Tab和回车)
      • [ ^/d ]表示匹配所有非数字
    • \d: 表示匹配的所有数字(0-9) (digit)

    • \w: 表示匹配的是数字字母下划线 (word)

    • \s: 表示匹配表示空白

    • _\t\n: 匹配到(空格,Tab和回车)

    • \D: 表示只要不是数字都可以匹配

    • \W: 表示只要不是数字字母下划线就可以匹配

    • \S: 表示只要不是空白就可以匹配

    • [\d\D] [\s\D] [\w\W]: 表示匹配所有

    • ^: 匹配字符串的开始

    • $: 匹配字符串的结尾

    • . :表示匹配出换行符外的所有

    • |: 表示或,(ad|bc)匹配ad或bc,但如果ad匹配成功了就不会去匹配bc,所以如果两个规则有重叠部分,总是将长的放前面

    • ( ): 约束,如www.(taobao|baidu|jingdong).com

量词

  • 量词
  • {n}: 表示重复n次
    • {n,} : 表示重复最少n次
    • {n,m} : 表示重复最少n次,最多m次
    • : 表示重复0次或一次
    • +: 表示重复1次或多次
    • *: 表示重复0次或多次
      • \d+表示所有整数 \d+\ .\d+ 表示所有小数
      • \d+\ .?\d+表示整数或小数(有缺陷)
      • \d+(\ .\d+)? 表示完整的整数和小数

贪婪匹配与非贪婪匹配

  • 贪婪匹配(回溯算法)

    • 在量词允许的范围下尽可能匹配多的内容
    • .*x 表示匹配任意字符 任意多次,遇到最后的x才停下来
  • 非贪婪(惰性)匹配----> (量词+?)

  • 在量词允许的范围内尽可能少的匹配内容

    • .*?x 表示匹配任意字符 任意多次,遇到第一个x就停下来

转义符

  • 转义符

    • 原本有特殊意义的字符,到了表达它本身的意义的时候需要转义符 **\ **

      • \ \t \ \n \ . \ - \ ? **\ + ** **\ * ** \ ( \ )
    • 有一些有特殊意义的内容,放在字符组 **[ ] **中,会取消它的特殊意义
      • [().*?+] 所有的内容在字符组中会取消它的特殊意义
      • [a\ -c] -在字符组中表示范围,如果不希望它表示范围,就需要转义,或者放在字符组最前面或者最后面
  • 正则实例

    • ^([1-9] \d{16}[\dx]|[1-9]\d{14})$ : 匹配17位身份证

re模块

re.findall

  • re.findall ('正则表达式' , '内容字符串')

    • 可通过分组 ( ) 来设置分组优先,从而只显示分组中的内容

      • 为什么用到分组:比如我们要查找的内容在一个非常复杂的环境中,而这个环境没有什么明显的特征,甚至会和其他混乱的信息掺杂在一起,这时候我们就需要设置分组来筛选我们所需要的数据
    • 可通过 ( ?: ) 来取消分组优先
    • 分组命名的引用 (?P < name > 正则表达式)
      • 使用ret.group('name')来获取数据
      • \1在正则表达式里是表示第一个分组
    • 可以用r" "去取消原本转义
    ret=re.search(r'<(\w+)>(?P<name>.*?)</\1>','<h1>yuhu788</h1>   <h2>uyu7678</\h2>')
    print(ret.group('name'))
    import re
    ret1=re.findall('1\d\d','167jjh767yhg17926')
    print(ret1) #['167', '179']
    ret2=re.findall('1(?:\d)(\d)','167jjh767yhg17926') #设置分组优先
    print(ret2) #['7', '9']
    • 什么是爬虫

      • 通过代码ret=request.get('网页')去获取一个网页的源码
      • 通过re模块筛选从网页上获取的源码内容

re.search

  • re.search('正则表达式' , '内容字符串')

    • 按照完整的正则进行匹配,只会显示匹配到第一个的字符串内容
  • 设置分组优先对re.search没用

    • 结果通过.group( )获取
    import re
    ret1=re.search('1\d\d','167jjh767yhg17926')
    print(ret3.group()) #167
    ret2=re.search('1(\d)\d','167jjh767yhg17926')
    print(ret4.group()) #167

re.match

  • re.match('正则表达式' , '内容字符串')

    • 按照完整的正则进行匹配,只会显示匹配到第一个的字符串内容
    • 结果通过.group( )获取
  • re.search对比,re.match在正则前默认加上了元字符^

    import re
    #第一种,会报错
    ret1=re.match('1\d\d','467jjh767yhg17926')
    print(ret1.group()) #AttributeError: 'NoneType' object has no attribute 'group'
    #第二种,匹配成功,正常运行
    ret2=re.match('1\d\d','167jjh767yhg17926')
    print(ret2.group()) #167

re.compile

  • re.compile('正则表达式' )

    • 从时间上节省,当连续多次使用同一个正则表达式时,可以使用re.compile
    import re
    res=re.compile('\d+')
    ret=res.findall('167jjh767yhg17926')
    print(ret)

re.finditer

  • re.finditer('正则表达式' )

    • 从空间上节省,生成一个iter迭代器
    ret=re.finditer('\d+','167jjh767yhg17926')
    for i in ret: #循环iteration
    print(i.group()) #通过.group方法进行取值
    #最终结果 #167
    #767
    #17926
  • 可以既从时间上节省,也可以从空间上节省

    import re
    res=re.compile('\d+')
    ret=res.finditer('167jjh767yhg17926')
    for i in ret:
    print(i.group()) #最终结果与上一个一致

re.split

  • re.split('正则表达式' , '内容字符串')

    • 对内容字符串按正则进行切分
    import re
    ret=re.split('\d+','167jjh767yhg17926')
    print(ret) #['', 'jjh', 'yhg', '']

re.sub

  • re.sub('正则表达式' , ' 要替换的字符串' , '内容字符串' , '替换的次数')

    • 对内容字符串根据正则进行替换
    import re
    ret=re.sub('[a-zA-Z]+','yzh','167jjh767yhg17926',2)
    print(ret) #167yzh767yzh17926

re.subn

  • re.subn('正则表达式' , ' 要替换的字符串' , '内容字符串' )

    • 对内容字符串根据正则进行替换,返回一个元组,存放了最终结果以及替换次数
    import re
    ret=re.subn('[a-zA-Z]+','yzh','167jjh767yhg17926')
    print(ret) #(167yzh767yzh17926,2)

正则+re模块知识总结的更多相关文章

  1. Python模块(三)(正则,re,模块与包)

    1. 正则表达式 匹配字符串 元字符 .   除了换行 \w  数字, 字母, 下划线 \d  数字 \s  空白符 \n 换行符 \t  制表符 \b  单词的边界 \W  \D \S 非xxx [ ...

  2. python day 8: re模块补充,导入模块,hashlib模块,字符串格式化,模块知识拾遗,requests模块初识

    目录 python day 8 1. re模块补充 2. import模块导入 3. os模块 4. hashlib模块 5. 字符串格式:百分号法与format方法 6. 模块知识拾遗 7. req ...

  3. 日志(logging)与正则(re)模块

    logging模块 #日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中 #1.logging模块一共分为五个打印级别 debug.info.warn ...

  4. python正则--re模块常用方法

    前面几篇关于正则匹配的文章我用的方法都只有一个re.search 但其实正则re模块提供很多非常好用的方法,我们先来看看re模块都有那些属性方法呢 前面的一堆带_或者大写的就不关注了,主要关注最后面的 ...

  5. python模块 re模块与python中运用正则表达式的特点 模块知识详解

    1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...

  6. python 正则 re模块(详细版)

    正则表达式 什么是正则表达式? 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合 ...

  7. python:常用模块 知识整理

    time模块 time.time() # 时间戳:1487130156.419527 time.strftime("%Y-%m-%d %X") #格式化的时间字符串:'2017-0 ...

  8. 正则 re模块

    Python 正则表达式 re 模块 简介 正则表达式(regular expression)是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.比如,正则表达式 ‘hello ...

  9. python的正则re模块

    一. python的正则 python的正则模块re,是其内置模块,可以直接导入,即import re.python的正则和其他应用的正则及其相似,有其他基础的话,学起来还是比较简单的. 二. 正则前 ...

随机推荐

  1. SESSION劫持

    服务端和客户端之间是通过session(会话)来连接沟通.当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session.每个用户的session都是独立的,并且由服务器来维护.每个用户的s ...

  2. Cannot find libcrypto in Ubuntu

    https://stackoverflow.com/questions/13811889/cannot-find-libcrypto-in-ubuntu sudo apt-get install li ...

  3. Apache多处理模块

    介绍 Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作.不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率. ...

  4. 在okhttp的callback回调中加Toast出现Cant create handler inside hread that has not called Looper.prepare()...

    2019独角兽企业重金招聘Python工程师标准>>> 分析:callback中回调的response方法中还是在子线程中运行的,所以要调取Toast必须回到主线程中更新ui 解决方 ...

  5. js的call方法

    obj1.method.call(obj2,arg1,arg2,arg3...) call方法的作用就是 把obj1的方法放到obj2对象上使用 arg1,arg2....是参数,传给mehtod的哟 ...

  6. php数组存在重复的相反元素,去重复

    $arr1=array('a_b','c_d','b_a','d_c'); $arr2=array('a_b','c_d','b_a','d_c'); 条件: a_b==b_a:c_d==d_c: 需 ...

  7. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)

    题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...

  8. App 抓包代理设置

    1.设置 Fiddler 打开 Fiddler,Tools  -->  Fiddler Options  -->  HTPS (配置完后记得要重启 Fiddler) 选中  "D ...

  9. python(类继承)

    一.继承 1.单继承 一个对象使用另一个对象的属性和方法,被继承的类也称父类 (1)父类与子类的方法不一样 class Four(): def sub(self,x,y): return x + y ...

  10. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...