正则表达式

应用场景

  • 特定规律字符串的查找替换切割等
  • 邮箱格式、URL、IP等的校验
  • 爬虫项目中,特定内容的提取

使用原则

  • 只要是能够使用字符串函数解决的问题,就不要使用正则
  • 正则的效率较低,还会降低代码的可读性
  • 世界上最难理解的三样东西:医生的处方、道士的神符、码农的正则
  • 提醒:正则是用来写的,不是用来读的;在不知道功能的情况下,不要试图阅读别人的正则。

基本使用

  • 说明:正则的解析处理是由re模块完成

  • 相关函数:

    • match:从开头进行匹配,匹配到就返回正则结果对象,没有就返回None
    • search:从任意位置匹配,匹配到一次就返回,没有就返回None
    import re
    
    # 只从开头匹配,找到返回一个正则结果对象,没有找到返回None
    # m = re.match('abc', 'abcsdhasdasjabcweuqo')
    # 全部匹配,只要找到就停止并返回
    m = re.search('abc', 'sdhabcsdasjabcweuqo') if m:
    # 提取匹配到的内容
    print(m.group())
    # 获取匹配位置
    print(m.span())
    • findall:全局匹配,返回匹配到的结果列表,没有时返回空列表
    # 匹配所有内容,返回匹配结果组成的列表,若没有则返回空列表
    f = re.findall('abc', 'qwsdhaslabcsadjlasdoiabcdakls')
    if f:
    print(f)
    print(type(f))
    • compile:生成正则表达式对象
    # 生成正则表达式对象,用于正则匹配
    c = re.compile('hello') # 从开头进行匹配
    # m = c.match('hellosdsjldkabc')
    # 从任意位置匹配
    m = c.search('shdjkhelloaskjdha')
    if m:
    print(m.group())
    # 匹配所有
    f = c.findall('helloasjdhakhello')
    if f:
    print(f)

    将正则的匹配分两步完成:先创建正则对象,然后通过对象的match、search、findall方法完成匹配

正则规则

  • 单个字符:

    普通字符:简单来说就是一对一的完全匹配
    []:中间的任意一个字符
    [a-z]:a~z之间的字符(所有小写字母)
    [0-9]:0~9之间的字符(所有数字)
    [A-Z0-9]:所有的大写字母和数字
    [^abc]:除abc外的所有字符
    . :匹配'\n'以外的任意字符
    \d:所有的数字,等价于[0-9]
    \D:所有的非数字,等价于[^0-9]
    \w:所有的数字、字母(中文)、下划线等(就是字)
    \W:所有的非字字符(\w的取反)
    \s:所有的空白字符(\n、\t、\t、空格等)
    \S:所有的非空白字符
    \b:词边界匹配(开头、结尾、标点、空格)
    \B:非词边界匹配
  • 次数控制

    *:前面的字符出现任意次
    +:前面的字符出现至少一次
    ?:前面的字符出现至多一次
    {m}:指定次数,m表示出现的次数
    {m,}:至少指定次数
    {m,n}:指定范围内的次数,m到n次之间
    {,n}:至多n次,相当于{0,n}
     

    正则的匹配默认都是贪婪的(最大限度的匹配)

  • 边界限定

    • ^:以指定的内容开头
    • $:以指定的内容结尾
    • 示例
    import re
    
    # 以指定的内容开头
    # c = re.compile(r'^abc')
    # 以指定的内容结尾
    c = re.compile(r'kas$') s = c.search('abcsdhkas') if s:
    print(s.group())
  • 优先级控制

    • |:表示或,它拥有最低的优先级
    • ():用于表示一个整体,明确的指定优先级
    • 示例:
    import re
    
    c = re.compile(r'a(hello|world)b')
    
    s = c.search('aworldb')
    
    if s:
    print(s.group())
  • 分组匹配

    • 说明:()不但可以作为一个整体,还可以进行分组匹配
    • 示例1:
    import re
    
    c = re.compile(r'(\d+)([a-z]+)(\d+)')
    
    s = c.search('shd327sjahdajhsd87892ehawksd')
    
    if s:
    print(s.group())
    # 默认就是全部的匹配内容,等价于上式
    print(s.group(0))
    # 第一个()匹配到的内容
    print(s.group(1))
    print(s.group(2))
    print(s.group(3))
    print(s.span())
    print(s.span(0))
    print(s.span(1))
    print(s.span(2))
    print(s.span(3))
    • 示例2:给分组起名字
    import re
    
    # 固定匹配
    # c = re.compile(r'<div><a>\w+</a></div>')
    # \1表示前面第一个小括号匹配的内容
    # c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>')
    # 给()起名字
    c = re.compile(r'<(?P<goudan>[a-z]+)><(?P<ergou>[a-z]+)>\w+</(?P=ergou)></(?P=goudan)>') s = c.search('<div><a>百度一下</a></div>') if s:
    print(s.group())
  • 贪婪匹配

    • 贪婪:最大限度的匹配叫贪婪。正则的匹配默认是贪婪。
    • 非贪婪:只要满足匹配条件,能少匹配就少匹配;通过可以使用'?'进行取消贪婪
    • 示例:
    import re
    
    # 取消任意多次的贪婪
    # c = re.compile(r'a.*?b')
    # 取消至少一次的贪婪
    c = re.compile(r'a.+?b') s = c.search('abdhsadjbsdjabs') if s:
    print(s.group())
  • 匹配模式

    • 说明:所谓模式就是对匹配的原则进行整体的修饰
    • 示例:
    import re
    
    # 忽略大小写的匹配
    # c = re.compile(r'hello', re.I)
    # s = c.search('Hello world') # 进行多行匹配,默认单行匹配
    # c = re.compile(r'^hello', re.M)
    # s = c.search('world \nhello') # 做为单行处理 或 让 . 能够匹配 \n
    c = re.compile(r'<div>.*?</div>', re.S)
    # string = '<div>hello</div>'
    string = '''<div>
    hello
    </div>'''
    s = c.search(string) if s:
    print(s.group())
  • 字符转义

    • 若匹配正则语法中的特定字符都需要进行转义
    • 正则字符串会被处理两次,python中处理一次,re模块会在处理一次
    • 若不想考虑字符的转义问题,可以在书写正则字符串时前面加一个字符'r'
    • 添加'r'之后,在python不会再进行任何转义,只需在与正则语法相关的字符前加''即可让其使用原有意义

Python基础—15-正则表达式的更多相关文章

  1. 十七. Python基础(17)--正则表达式

    十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...

  2. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  3. Python基础之 正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  4. python基础之正则表达式

    正则表达式语法 正则表达式 (或 RE) 指定一组字符串匹配它;在此模块中的功能让您检查一下,如果一个特定的字符串匹配给定的正则表达式 (或给定的正则表达式匹配特定的字符串,可归结为同一件事). 正则 ...

  5. Python高手之路【五】python基础之正则表达式

    下图列出了Python支持的正则表达式元字符和语法: 字符点:匹配任意一个字符 import re st = 'python' result = re.findall('p.t',st) print( ...

  6. python基础之正则表达式和re模块

    正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...

  7. python基础之 正则表达式,re模块

    1.正则表达式 正则表达式:是字符串的规则,只是检测字符串是否符合条件的规则而已 1.检测某一段字符串是否符合规则 2.将符合规则的匹配出来re模块:是用来操作正则表达式的 2.正则表达式组成 字符组 ...

  8. python基础-RE正则表达式

    re 正则表示式 正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写 ...

  9. python基础之正则表达式。

    简介 就其本质而言,正则表达式是内嵌在python内,由re模块实现,小型的专业化语言,最后由c写的匹配引擎执行.正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来 ...

  10. Python开发【第一篇】Python基础之正则表达式补充

    正则表达式 一简介:就其本质而言,正则表达式(或RE)是一种小型的.高度专业化的标称语言,(在Python中)它内嵌在Python中,并通过re模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...

随机推荐

  1. 修改ThinkPHP的验证码类

    今天用ThinkPHP重新开发一个系统,用到了ThinkPHP的验证码类,由于我希望验证码别太复杂,希望验证码里边只有数字,却发现该Verify类并未提供设置验证码中使用的字符的配置的方法,于是查看源 ...

  2. 上下文(Context)和作用域(Scope)

    函数的每次调用都有与之紧密相关的作用域和上下文.从根本上来说,作用域是基于函数的,而上下文是基于对象的. 换句话说,作用域涉及到所被调用函数中的变量访问,并且不同的调用场景是不一样的.上下文始终是th ...

  3. Win2D 官方文章系列翻译 - 预乘 Alpha

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-premultiplied-alpha/ 在计算机绘图中有两种表示颜色值不透明度的方法.Win2D 中两种方法 ...

  4. 弹性布局学习-详解flex-wrap(五)

    目录 弹性布局学习-介绍(一)  弹性布局学习-详解 flex-direction[决定主轴的方向](二) 弹性布局学习-详解 justify-content(三) 弹性布局学习-详解 align-i ...

  5. 3.storm-starter打包在storm集群上运行

    1.使用maven或者其他打包工具将storm-starter打成jar包 2.请将jar包用解压工具打开在根目录下找到defaults.yaml文件并将其删除不然到时会报有multiply defa ...

  6. OLEDB 参数化查询

    一般情况下,SQL查询是相对固定的,一条语句变化的可能只是条件值,比如之前要求查询二年级学生信息,而后面需要查询三年级的信息,这样的查询一般查询的列不变,后面的条件只有值在变化,针对这种查询可以使用参 ...

  7. 微信小程序--阻止冒泡事件

    微信小程序事件的使用方式 在组件中绑定一个事件处理函数. 如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数. <view id="tapTest ...

  8. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  9. cordova 开发 ios app 简要流程

    1  安装node.js环境 官网: http://nodejs.org/ 点击[install],会下载mac的安装包.正常安装即可 2 安装cordova:npm install -g cordo ...

  10. 【Linux】IPC-消息队列

    问题 消息队列id 和键值KEY区别? 首先要注意一个概念:IPC结构都是内核的结构.也就是说IPC结构由内核维护,对于每个进程都是公共的,不属于某个特定进程.只有这样,IPC结构才能支持它们&quo ...