正则表达式

定义+特点

  • 什么是正则表达式:一套用于匹配字符串的规则
  • 正则表达式测试网站(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. influxdb 安装

    influxdb是一款开源的时序数据库,可以用作监控系统的数据存储或用来存储基于时序进行分析的业务系统的数据存储. influxdb的部署及使用均比较简单,但是集群(官方版集群已闭源)及高可用方案较少 ...

  2. 2019-2020-1 20199325《Linux内核原理与分析》第八周作业

    Linux内核如何装载和启动一个可执行程序 1.理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节:​ 2.编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链 ...

  3. [Batch脚本] if else 的格式

    必须写成一行 ) else (,否则报错. if %abc%=="yes" ( ... ) else ( ... )

  4. [Windows API] Listing the Files in a Directory,可用来数文件夹下有多少个子文件(夹)

    转载 #include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe ...

  5. Linux网络服务第二章DHCP原理与配置

    1.笔记 服务端端口:67 客户端端口:68 dhcliemt -r:释放IP地址 dhcliemt -d:重新获取IP地址 :.,$ s/190.168.200 / 192.168.100 /g 从 ...

  6. 【Linux常见命令】cd命令

    BASH_BUILTINS(1) cd命令用于切换当前工作目录至 dirName(目录参数). 其中 dirName 表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的 home 目录 ( ...

  7. Struts2深入之动态调用Action

    使用过Struts2的小伙伴们应该知道当我们的action的方法过多是如果需要通过Struts2框架进行运行,我们就必须在Struts2的配置文件Struts2.xml文件中配置多个action属性标 ...

  8. Jmeter 数据库测试

    1.环境准备,下载驱动 mysql-connector-java-5.1.45-bin.jar 下载的 jar 包保存在 Jmeter 的文件的 lib 下的 ext 目录下,则不需要做其他的配置了, ...

  9. 学习笔记之MySQL的使用

    什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文 ...

  10. Tomcat Ghostcat - AJP协议漏洞DEBUG

    环境 IntelliJ IDEA 2020.1 x64 tomcat-8.5.46 配置 pom.xml <?xml version="1.0" encoding=" ...