正则表达式

定义+特点

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

    XSS Challenges http://xss-quiz.int21h.jp/ Stage #1 注入alert(document.domain),先试一试输入后会返回什么: 返回在标签中,直接尝 ...

  2. POJ3460 Booksort

    飞来山上千寻塔,闻说鸡鸣见日升. 不畏浮云遮望眼,自缘身在最高层.--王安石 题目:Booksort 网址:http://poj.org/problem?id=3460 Description The ...

  3. (转)ATOM介绍和使用

    一,Atom介绍 Atom 是 Github 开源的文本编辑器,这个编辑器完全是使用Web技术构建的(基于Node-Webkit).启动速度快,提供很多常用功能的插件和主题,可以说Atom已经足以胜任 ...

  4. 字符串translate方式实现

    在爬取百度图片的时候,发现百度图片做了反爬虫处理,在网上找到当前还能跑通的教程实例:python3多线程下载百度图片搜索结果. 在分析代码的过程中,发现作者对爬取的objURL的解码是通过字符串的tr ...

  5. I/O多路复用之select,poll,epoll简介

    一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...

  6. VS2013 配置全局 VC++目录

    原文链接:https://blog.csdn.net/humanking7/article/details/80391914 也许是我VS2013安装的有问题,每次编译程序都要去 项目属性页-> ...

  7. socket编程-多个客户端向服务器发送人脸照片,服务器返回识别结果(服务器使用多线程)...

    recognition.py import numpy as np import face_recognition import os class recognition: def __init__( ...

  8. 图论--网络流--最大流 POJ 2289 Jamie's Contact Groups (二分+限流建图)

    Description Jamie is a very popular girl and has quite a lot of friends, so she always keeps a very ...

  9. redis系列之4----redis高级应用(集群搭建、集群分区原理、集群操作)

    文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...

  10. POJ3255(次最短路)

    描述 求1到n的次最短路 开个\(dis[maxn][2]\)的储存距离的二维数组,0储存最短路,1储存次短路 初始化全为正无穷,\(dis[1][0]=0;\) 然后遍历更新时,先尝试更新最短路和次 ...