正则表达式如何同时添加左右括号 sub_python小课堂24 - 正则表达式(二)

2023-11-03

python小课堂24 - 正则表达式(二)

前言

今天继续来介绍一下python的正则表达式,回顾一下上次介绍的re模块整篇文章围绕着re.findall()来进行实例的讲解,也就是所谓的查询操作。为了便于回顾,这里给出链接:python小课堂23 - 正则表达式(一)

re模块的sub函数

sub:中文有代替的意思。使用re.sub()可以完成我们对原始字符串的替换操作!

先来看下官方函数的参数解释:

re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。(如:re.I 使匹配对大小写不敏感)

一大波实例来袭,做好准备哟!

实例1(替换普通字符):

假设我数学和英文考试都得了60分……然而我并不甘心,上天给了我一次作弊的机会,可以通过程序来替换分数!如何做呢?

import 

同理,若是只想修改数学成绩,则将count参数改为1即可:

实例2(有逻辑的函数替换):

假设我的数学成绩考了85分!emmm相当不错了,但是我依然想让它增加5分,我爱数学!而英语这次考了100分,因为作弊了……为了不让老师察觉,我决定偷偷降低点分数!两种条件,如何才能使用sub函数来完成呢?别忘了我们的repl(replace)参数是可以传递函数的!这也是Python的一个特性,参数可以传递函数,如下:

import 

讲解一下:在modify_score中,使用传入score,可以打印输出看下它的类型,这是一种正则的类型,而非字符串类型。此类型要将其内容本身匹配出来,则需要调用它的group()方法,new_score取出来的便是数字形式的字符串。下面的逻辑对比,需要将字符串转换为int型,才可以进行对比操作,否则会报错哟。

综上所述: re.sub()可以轻松的实现字符串的替换,并且可以用函数传递的方式来对原始字符串进行业务逻辑的判断。

re模块其它常用函数

1. match

依然是用事例来解释看下:

import 

上述结果,打印为None,Why???

因为match函数在进行匹配的时候,是从字符串的起始开始进行匹配,若开头的字符串不符合正则表达式,则直接返回None,也就是什么都没匹配到,停止后续匹配。

所以如果修改words,让我们的分数在字符串开头试下:

2. search

使用search的示例如下:

import 

上述结果,打印出了匹配到的对象与值,与match不一样!但是可以看到,search函数只匹配到了一次的,后续分数的100即使符合正则表达式,也不会被匹配到了。

match和search函数是当今市场上各教程类中,写爬虫最常用的两个方法,而实际上这两个函数是需要对匹配后的结果进行group分组处理,才能取出你想要的结果。在上节的小课堂中,全篇讲到的findall方法,则不需要进行group的调用,可以直接将结果以list全面匹配出来,这也是findall和match、search函数最大的区别。

group分组

既然提到了group分组,那么就来介绍下,group的具体用法,以及在爬虫中经常会以一种什么样的方式去进行你想要的匹配!

此处以search函数来举例,场景是酱紫的:我自己说了一句话 ,「我在这次考试中,数学分数考了85,英语分数考了100分,这真是太酷了!」。现在需要将「英语分数考了100分」获取到!代码如下:

import 

仔细看过代码的同学,肯定会疑惑为什么写了这么多行正则匹配的表达式,莫急莫急,且听我慢慢道来。在不看我下面的解释前,你认为,下面这四个print()会依次打印出什么样的结果呢?

解释:其实new_words1~4是一段非常有逻辑的演变过程。

① 先来看new_word1,如果想要匹配我英语分数考了100分这段英文字符,需要先使用普通字符串进行边界的限定,还记得吗?(上节小课堂有说过哦!忘了的话回到文章首处点击链接进行回顾。) 所以使用"ponit, "和"That"进行边界限定,一旦边界限定后,便可以使用元字符来进行内容的匹配,而 w 代表的含义是匹配包括下划线的任何单词字符。于是调用如下图:

可以看到报错啦,错误说的是None类型没有group方法,因为1中的正则是错误的,没有正确进行匹配,所以最终得到的值是None。理由很简单,因为 w 这样的写法只进行了单字符匹配,故然是不行的。如何进行多字符匹配呢?于是有了new_word2。

② 来看new_word2,普通字符的边界限定写法是不变的,在原来的基础上,在 w 后面新增 * * 的元字符代表的含义是匹配前一个字符0次或n次以上。然后有了下图:

为毛还是报错?然后在反思下,发现。。。哦原来是想匹配的字符串中是包含空格的,而w是不能匹配到空格字符的,所以这个正则表达式的写法依然不对!再继续,什么元字符可以进行空格和字母的匹配呢?于是有了new_words3。

③ new_words3中使用的是.来进行空格和字母的匹配,点的后面还是使用*来匹配。如下图:

可以看到正确的结果了,终于没有报错了!但是呢,但是呢,但是呢。。。会发现,匹配到的结果却不是我想要的最终结果,它把整个正则表达式的限定边界也匹配到了...于是再次改进,就有了最后的new_words4。

④ new_words4是在③的基础上,除去了边界字符的限定,将.*用小括号扩了起来,此处就是在上节小课堂中提到的分组!而一旦分好组之后,我们便可以通过group将自己定义好的分组提取出来,清理下以上注释调的代码:

import 

不难发现,其实group()中是可以传递数字的,默认情况下不写等同于0,可以看到上图不写和写0是一个输出结果。这里需要说下,为什么0匹配出来的是整段正则表达式的字符串,而不是我想要的“My English scored 100 points.”这句话。先来看下两段代码:

new_words4 

实际上,new_words4是等效于new_words5的,在new_words5中默认的正则参数位置是有一层隐形的小括号,也就是最外面的组,所以当我们调用group(0)或者group()实则是指这层组的关系。

若想调用组中组,需要从左到右,数字是从1开始进行调用的,和上面的代码结果图的最后一行是对应上的!

总结

到这里,关于Python的正则表达式常用的几点也就介绍完了,为什么要讲述正则呢?因为这是处理字符串文本必不可少的一个强大工具!只要能得心应手的使用它,相信不论是在处理爬虫想要的信息也好,数据清洗时处理也罢,都可以轻松玩转字符串!

用思维导图来回顾下正表达式的所有常用知识点吧,所谓一图胜过千言万语,毕竟可以来梳理思路(点开食用更加哟!):

至此完!

有想交流沟通python相关知识的同学,欢迎关注公号:migezatan(咪哥杂谈).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式如何同时添加左右括号 sub_python小课堂24 - 正则表达式(二) 的相关文章

  • linux驱动面试题2018

    linux驱动面试题2018 面试题整理 含答案 版权声明 本文为博主原创文章 未经博主允许不得转载 转载请标明原址 https blog csdn net kai zone article details 82021233 前言 这篇文章
  • Camera:高斯模糊

    高斯模糊场景 手机相机不同于工业相机以及车载相机 手机相机的模式切换往往会伴随着预览分辨率的改变 而分辨率的切换伴随手机App gt Framework gt HAL gt Drivel一层层的下发上传 所造成的时间延迟已经带来了不可忽略的
  • Elasticsearch数据刷新策略RefreshPolicy简述

    说明 默认情况下ElasticSearch索引的refresh interval为1秒 这意味着数据写1秒才就可以被搜索到 每次索引refresh会产生一个新的 lucene 段 这会导致频繁的 segment merge 行为 对系统 C
  • node入门(一)bcrypt密码加密和验证

    前言 node js越来越被广泛的使用 现在找工作职位要求上大都写熟悉或了解一门后端 语言 如 java php node等 Node js是一个javascript运行环境 它让javascript可以开发后端程序 实现几乎其他后端语言实
  • 一道智力题--三个运动员参加M个项目,在每一项目中,第一,第二,第三名分别得X,Y,Z分

    题目 有一种体育竞赛共含M个项目 有运动员A B C三人参加 在每一项目中 第一 第二 第三名分别得X Y Z分 其中X Y Z为正整数且X gt Y gt Z 最后A得22分 B与C均得9分 B在百米赛中取得第一 1 求M的值 2 在跳高
  • 使用excel将一个数字随机分摊?

    在Excel中 如何把一个数值随机分配到N个单元格内 分配后每个单元格的数值之和等于这个数值 比如这里我们需要在A1 A10区域中随机输入数字 其实结果等于10000 这里我们可以选中区域 然后输入公式 FREQUENCY ROW 1 10
  • python代码,用于获取mp3部分信息并存入MySQL中

    a1 a2 a3 a4参数需要自己输 host a1 user a2 password a3 database a4 import os import base64 import struct import pymysql 这是python
  • 在github上创建个人主页的方法【2023更新版】

    01 进入github的网站 链接 https github com 然后注册 登陆 注意登陆时设置的用户名 username 就是将来你个人主页的三级域名 所以这里一定要慎重填写username 如下图所示 02 注册完成后进入个人主页如
  • (详细简单成功版本)Mysql主从复制

    博主不易 如果有帮助点个赞加个关注再走啊家人们 目录 介绍 配置 前置条件 大坑 如果两份mysql文件都是复制的一份 那么就修改其中一份的uuid 要不后续配置不成功 配置 主库Master 1 修改Mysql数据库的配置文件my ini
  • 为自己的站点实现访客统计

    简介 我们都很好奇自己的站点有没有被人所熟知 每天能有多少的访问量 最简单的方法便是使用平台的统计功能 比如cnzz 百度统计 谷歌统计等等平台 但这篇文章的重点是自己写代码实现统计功能 一 HTML语句实现 推荐加到页面的底部界面
  • 数组 求上升区间的高度和

    求上升区间的高度和 LC 买卖股票的最佳时机 II 思路 如果上升 则max next pre Objective C 求上升区间的高度和 NSMutableArray array NSMutableArray arrayWithArray
  • Java项目:考试系统(java+JSP+bootstrap+Servlet+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 本系统分为两个角色 一个是考生 一个是管理员 考生功能如下 登录 选择考试科目 选择考卷 在线考试 提交试卷 并且查询自己的考试成绩 管理员功能如下 登录 添加试卷 并且添加试卷里的题目 编辑
  • Linux(Ubuntu)系统上下载安装Redis

    redis最新版本可以到官网自己下载 这里提供5 0 2的版本 Redis 5 0 2 tar gz网盘资源如下 百度网盘 请输入提取码https pan baidu com s 1ZGy vI7n4RmTb9kLnWe91w压缩包下载完成
  • 使用路由器搭建局域网

    A 如果搭建的是有网局域网 网线插到WAN接口 一般都是蓝色的 买路由器时会自带一条网线 把它的一头插到LAN接口 随便插一个口就行 另一头插到电脑网线接口上就好 B 如果搭建的是无网局域网 路由器只需要接通电源就行 WAN接口不需要插网线
  • 机器学习——SVM的易错题型

    问 支持向量机仅可以用于处理二分类任务 答 错误 支持向量机可以用于处理多分类任务 通过使用一对多或一对一的方法 将多个类别分别与其他类别做二分类 也可以使用多类支持向量机算法 直接将多个类别一起纳入训练和分类过程中 此外 支持向量机还可以
  • YoloV8改进策略:重新思考高效的基于注意力的移动块模型EMO重新定义了轻量化的YoloV8

    文章目录 摘要 论文翻译 EMO 重新思考高效的基于注意力的移动块模型 1 介绍 2 方法论 归纳法和演绎法 2 1 通用效率模型标准 2 2 元移动块 2 3 微设计 倒置残余移动块 2 4 面向密集预测的EMO宏观设计 3 实验 3 1
  • Large Language Models and Knowledge Graphs: Opportunities and Challenges

    本文是LLM系列的文章 针对 Large Language Models and Knowledge Graphs Opportunities and Challenges 的翻译 大语言模型和知识图谱 机会与挑战 摘要 1 引言 2 社区
  • 40道Python经典面试题(附答案)

    1 什么是Python 使用Python有什么好处 Python是一种编程语言 包含对象 模块 线程 异常和自动内存管理 Python的好处在于它简单易用 可移植 可扩展 内置数据结构 并且它是一个开源的 2 什么是PEP 8 PEP 8是
  • uniapp踩坑-使用vue-cli框架对node版本有要求

    uniapp踩坑 使用vue cli框架对node版本有要求 前言 背景 最近在开发uniapp 官方文档提供的开发方式有两种 一种是通过HBulider可视化界面创建 一种是通过vue cli命令行创建 因为可视化更加方便 所以就使用了可

随机推荐

  • 设计算法来统计一个输入字符串中所包含的整数个数,并输出这些数

    设计算法来统计一个输入字符串中所包含的整数个数 并输出这些数 假设输入的字符既有数字又有非数字的字符 例如 ak123x456 17960 302gef4563 其中连续数字作为一个整体看成整数 例如123 456等 include
  • 二进制补码运算

    在计算机系统中 数值一律用补码来表示和存储 原因在于 使用补码 可以将符号位和数值域统一处理 同时 加法和减法也可以统一处理 此外 补码与原码相互转换 其运算过程是相同的 不需要额外的硬件电路 补码运算 正数补码是其原码 负数的补码为其数值
  • react使用dnd实现简单的拖拽排序

    在react项目中使用dnd实现一个简单的拖拽排序功能 首先简单的介绍一下dnd React DnD是一组React实用程序 可帮助您构建复杂的拖放界面 同时保持组件之间的耦合 1 DndProvider组件为您的应用程序提供React D
  • Vue 3 快速上手

    Vue 3 快速上手 官网 配置环境变量和nodejs node vue 开发环境搭建 第二天的时候 vue create xxx xxx xxx 项目名 失败 前端项目问题解决 第二天修改环境配置之后 纠正之后 概念 思想 创建项目 cm
  • 国产适配之MySQL替换为达梦8数据库

    1 背景 项目中要做国产化 MySQL要替换成达梦8数据库 项目中MySQL的建表语句和内置数据通过 sql文件维护 安装时会初始化表结构和表内置数据 项目架构为SpringBoot JPA Mybatis 适配工作内容包括数据库迁移 数据
  • Vue实现点击更改页面字体大小

    html 1 点击大中小 页面字体会切换到对应的css样式 2 big mid sml 代表预设定了三种字体大小 3 on 代表当前选中了哪一个的样式 big min sml 选中后字体加粗 4 v html 利用后端传来的页面数据 通过v
  • text段、data段和bss段知识介绍

    一 总体概述 1 bss 可读可写 bss是英文Block Started by Symbol的简称 通常是指用来存放程序中未初始化的全局变量的一块内存区域 在程序载入时由内核清0 BSS段属于静态内存分配 它的初始值也是由用户自己定义的连
  • go语言基础2——流程控制if、for、switch、goto、break、continue

    目录 if else 分支结构 if条件判断基本写法 if条件判断特殊写法 for 循环结构 无限循环 for range 键值循环 switch case goto 跳转到指定标签 break 跳出循环 continue 继续下次循环 练
  • html手风琴效果代码,一款漂亮的纯CSS手风琴效果代码

    本文分享了纯css实现的手风琴 喜欢的朋友可以看看 源码CSS部分 accordionMenu width 500px margin 0 auto padding 10px background size fff color 424242
  • 前端代码深浅拷贝四种方式

    今天公司的实习生有问我代码怎么深拷贝 下面我就给大家整理四种前端代码深拷贝的四种方式 前端数据分为基本数据类型和引用数据类型 当我们拷贝引用数据类型的时候 我们希望改变新数组 对象 不改变原本的数组 对象 我们往往会深拷贝数据 下面是四种深
  • Python paramiko文件传输显示上传下载进度条源码 - stdout

    本文Python Code基于chatGPT的推荐 并修改调试实际运行通过 供学习参考 通过使用python paramiko库 实现文件传输 包括上传和下载 并且同步显示上传和下载进度条信息 实时获取传输进度 避免print方式频繁刷屏困
  • Spring Boot 配置多数据源

    Spring Boot 配置多数据源 作者 Grey 原文地址 博客园 Spring Boot 配置多数据源 CSDN Spring Boot 配置多数据源 说明 本文主要介绍了 Spring Boot 下如何配置多数据源 环境和版本 Ja
  • 静态路由综合实验

    目录 实验要求 实验步骤 1 子网划分 2 配置IP和环回 3 配置静态路由 实现全网可达 4 配置缺省路由 使R1 R4可以访问5 5 5 5 24 5 配置空接口防环 6 ping测试 实验要求 1 除R5的环回地址固定以外 整个其他所
  • 10个最好的 jQuery 视频插件

    在这篇文章中已经收集了10个最佳的jQuery视频插件 帮助开发人员容易地实现网站播放影片功能 可以显示视频和视频播放列表 1 Bigvideo js BigVideo js 是一个jQuery插件能够 让你很方便将视频作为网站的背景 它可
  • FCM算法的matlab实现(Fuzzy C-means 算法)

    FCM算法 F C M FCM FCM算法简介 F C M FCM FCM算法原理 F C M FCM FCM算法实现 m a t l a b matlab matlab F C M FCM FCM算法简介 F C M FCM FCM算法属
  • `com.mysql.jdbc.Driver‘. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver‘的解决办法

    com mysql jdbc Driver This is deprecated The new driver class is com mysql cj jdbc Driver 的解决办法 说多了都是泪 搭建这个项目遇到的问题太多了 cs
  • Tensorflow中问题总结

    1 ValueError Variable bar v does not exist or was not created with tf get variab le Did you mean to set reuse None in Va
  • 基于Tensorflow卷积神经网络(CNN)的人脸年龄和性别检测系统

    文件大小 150M 开发环境 Python3 7 OpenCV4 0 1 24 Tensorflow1 13 1 PyCharm2020 点击下载 点击下载 简要概述 基于Tensorflow卷积神经网络 CNN 的人脸年龄和性别检测系统
  • Unity BRDF公式解析

    根据BRDF公式 高光项部分 只能物体的表面的粗糙度有关 Roughness有关 大部分公式都是 根据Cook Torrance 的微表面高光BRDF公式 我们把高光分成三项 D项 Normal Distribution Function
  • 正则表达式如何同时添加左右括号 sub_python小课堂24 - 正则表达式(二)

    python小课堂24 正则表达式 二 前言 今天继续来介绍一下python的正则表达式 回顾一下上次介绍的re模块整篇文章围绕着re findall 来进行实例的讲解 也就是所谓的查询操作 为了便于回顾 这里给出链接 python小课堂2