正则表达式

定义+特点

  • 什么是正则表达式:一套用于匹配字符串的规则
  • 正则表达式测试网站(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. Docker数据管理(一)

    数据卷挂载 在生产环境中,需要对数据进行持久化,冗余化,或者在需要在多个容器之间进行数据共享 数据卷:容器内数据直接映射到本地主机环境 数据卷容器:使同特定容器维护数据卷 -v 进行映射 1.在容器内 ...

  2. CG-CTF(5)

    CG-CTF https://cgctf.nuptsast.com/challenges#Web 续上~ 第二十二题:SQL注入1 点击Source: 分析: mysql_select_db()函数: ...

  3. CentOS上安装配置 mongodb

    CentOS 首先yum list mongo* 查看是否有关于mongo的安装包,检查后安装即可   mongo 分client端和server端,server启动db服务,client可以连接到s ...

  4. Windows系统自带的ODBC Data Sources的配置及使用

    一直不明白ODBC是个什么东东,虽然一次次碰到,却从没用过,看Wikipedia上的描述,可以访问各种数据库.Excel.CSV等,可以剥离数据库和操作系统依赖,简直神乎其神.不过这样的描述太抽象概括 ...

  5. 怎么将swagger API导出为HTML或者PDF

    文章目录 将swagger API导出为HTML或者PDF 什么是Asciidoc swagger2markup-maven-plugin asciidoctor-maven-plugin 使用命令行 ...

  6. ZK安装、ZK配置、ZK集群部署踩过的大坑

    天天采坑.来来咱们一起来填zookeeper的坑呀!! 解决坑一定要注意zk根目录下的神器,那就是logs目录下的日志, 第一坑:错误: 找不到或无法加载主类 org.apache.zookeeper ...

  7. Ribbon 框架简介及搭建

    2019独角兽企业重金招聘Python工程师标准>>> Ribbon简介 1.  负载均衡框架,支持可插拔式的负载均衡规则 2.  支持多种协议,如HTTP.UDP等 3.  提供负 ...

  8. .NET Core+WebApi+EF访问数据新增用户数据

    新建一个.NET Core项目,我使用的IDE是VS2019 依次创建三个Core类库:第一个命名api.Model,第二个api.Common,第三个api.Bo 解释一下这个三类库的作用: 第一个 ...

  9. Spring MVC的Controller接受请求方式以及编写请求处理方法

    Controller接受请求参数的常见方法: 1.通过Bean接受请求参数: 创建POJO实体类 创建pojo包,并在该包中创建实体类UserForm,代码: package pojo; public ...

  10. ZABBIX自动发现Redis端口并监控

    由于一台服务器开启许多Redis实例,如果一台一台的监控太耗费时间,也非常容器出错.这种费力不讨好的事情我们是坚决杜绝的,幸好ZABBIX有自动发现功能,今天我们就来用该功能来监控我们的Redis实例 ...