Python语法基础---正则表达式

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

我们这个文章所讲述的,也是数据分析的基础文章,正则表达式

首先,我们在开始之前,引出一个问题。也是我们接下来想要解决的问题。

那就是,我们应该怎么判断合适的QQ号。

一个合适的QQ号应该包括下面的几个部分:

  1. 全数字
  2. 位数 5-11
  3. 开头不能为0

我们先给大家实现一下这个解决这个问题的代码,稍后再给大家讲解一下其中的原理。

def check_qq(qq):return qq.isdigit() and len(qq) in range(5,12) and not qq.startswith('0')
qq = '91915235'
res = check_qq(qq)
print(res)

这个是用我们之前所熟悉的代码来实现这个功能,这个应该不用太仔细解析,大家可以先好好看看。

我们接下来重点看用正则实现这个功能的部分。

def check_qq(qq):return qq.isdigit() and len(qq) in range(5,12) and not qq.startswith('0')
qq = '919152305'
res = check_qq(qq)
print(res)import re
def check_qq1(qq):r=re.match(r"^[1-9]\d{4,10}$",qq)return True if r else False
if __name__ =='__main__':qq='0543265'r1=check_qq1(qq)print(r1)r2=check_qq(qq)print(r2)

下面的部分就是用正则表达式实现的。其中包含了很多的知识点,这个需要我们慢慢来进行分析。

首先,我们先来看一下结果。

这两个的结果是完全相同的。

单字符匹配

单字符匹配就是说,无论[]里面包含了多少字符,只能匹配其中的一位。

.: 默认情况下,匹配除了换行符以外的任意字符。

match():如果匹配上,则返回match对象,如果未匹配上,则返回None

我们来看一下例子。

import re
r=re.match(r'.','\n')
print(r)
r1=re.match(r'.','5')
print(r1)

这个例子就可以很好的解释我们刚才所看到的。

后期在爬虫中,要爬取网页内容,网页中有大量的换行,则我们需要设置flags=re.DOTALL

r=re.match(r'.','\n',flags=re.DOTALL)

 我们再来看下一个例子

import re
r1=re.match(r"[0-9a-zA-Z]","F")
print(r1)
r2=re.match(r"[gbk]","b")
print(r2)
r3=re.match(r"[^gbk]","b")
print(r3)

我们可以看到,第一个和第二个都匹配到了,但是第三个没有,这是因为^只能匹配第一个。第一个不符合,就返回了None

我们来看下一个例子:

import re
r1=re.match(r"[0-9a-zA-Z]","F")
print(r1)
r2=re.match(r"\w","a")
print(r2)r3=re.match(r"\s"," ")
print(r3)
r4=re.match(r"\s","\n")
print(r4)

 在这段代码当中,我们可以看到的是,\s无论是空格还是换行符都可以匹配到。

数量词匹配

我们先来看一下示例代码

import re
print(re.match(r'\d\d\d\d',"4567"))

这个就是我们上面所讲到的单字符匹配,一共四个\d,所以可以匹配四个数字

那么,这个有更多的使用方式吗,答案是,有的。

我们来看下面的三种调用方法:

import re
# print(re.match(r'\d\d\d\d',"4567"))
print(re.match(r'\d{4}',"4654"))
print(re.match(r'\d{4,}',"464564654"))
print(re.match(r"\d{4,10}","46545497974564654654645"))

第一种是恰好调用四个,第二个是最少四个,第三个是四个到10个

我们可以来看一下打印出来的结果。

 我们再来看下一个例子:

import re
print(re.match(r'a?','aaaaaaaaaaaaaaaa'))
print(re.match(r'a+',''))
print(re.match(r'a*',''))

第一个表示单个字符,第二个表示1个或无数个,最后一个表示0个或无数个

我们再来看下一个例子:

import re
print(re.search(r'a?','aaaaaaaaaaaa'))
print(re.search(r'a+','aaa'))
print(re.search(r'a*','aaaa'))

下面使我们运行出来的结果。

其实search的底层调用的就是match,和match相似的是,调用成功的话,返回调用对象,如果不匹配的话,返回None。 

我们再来看一下下一种情况:

import re
print(re.findall(r'a?','aaaaaaaaa'))
print(re.findall(r'a+','aaaaaaaaa'))
print(re.findall(r'a*','aaaaaaaaa'))

下面是我们运行的结果。

findall()在源字符串中从左向右查找,将所有符合条件的子字符串全部查找出来 。

边界匹配

我们来看下一种情况

^和$匹配的是整个字符串的行首或行尾

import re
print(re.findall(r"^this","this is a text\nthis is a text\nthis is a text\n"))
print(re.findall(r"text$","this is a text\nthis is a text\nthis is a text\n"))

我们再来看一下打印出来的结果。

为什么只会打印出来一个呢?

这是因为默认情况下,即使字符串中有换行符,也是默认的单行模式。

我们可以设置在多行模式下面看一下:

import re
print(re.findall(r"^this","this is a text\nthis is a text\nthis is a text\n",flags=re.M))
print(re.findall(r"text$","this is a text\nthis is a text\nthis is a text\n",flags=re.M))

我们在后面加上一个re.M,就变成了单行模式,对应的,结果也会发生变化。

我们也可以搜索多行模式下面的第一个和最后一个,看下面这个代码

import re
print(re.findall(r"\Athis","this is a text\nthis is a text\nthis is a text\n",flags=re.M))
print(re.findall(r"text\Z","this is a text\nthis is a text\nthis is a text",flags=re.M))

在这种情况下,我们搜索到的也是一个

贪婪匹配和非贪婪匹配

?非贪婪匹配

+ * 贪婪匹配 

首先,我们来看一下下面这个代码:

import re
print(re.findall(r'a?','aaaaaaaaaaaaa')) #0个或者一个
print(re.findall(r'a+','aaaaaaaaaaaaa')) #一个或者多个
print(re.findall(r'a*','aaaaaaaaaaaaa')) #0个或者多个

这个其实就是我们之前所提到过的贪婪匹配和非贪婪匹配。

更多的非贪婪匹配和贪婪匹配的内容,我们在下一篇文章中说,大家,明天见。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5系列(8)-- 离线应用指南

前端技术探索系列:HTML5 离线应用指南 🌐 致读者:构建可靠的离线体验 👋 前端开发者们, 在现代 Web 开发中,离线应用已成为提升用户体验的重要组成部分。今天,我们将探索 HTML5 提供的离线技…

小家电出海,沃丰科技助力保障售后服务的及时性与高效性

随着全球化步伐的加快,小家电行业也逐渐迈向国际市场,面向全球消费者提供服务。然而,跨国界的销售和服务挑战也随之而来,尤其是售后服务的及时性与高效性成为了企业亟需解决的问题。沃丰科技凭借其全渠道在线客服、工单系统和视频…

Vulnhub靶场 Matrix-Breakout: 2 Morpheus 练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件上传2. 提权 0x04 总结 0x00 准备 下载连接:https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 介绍: This is the second in the Matrix-Br…

2020 年 12 月青少年软编等考 C 语言四级真题解析

目录 T1. 开餐馆思路分析T2. 邮票收集思路分析T3. 带通配符的字符串匹配思路分析T4. 删除数字思路分析T1. 开餐馆 北大信息学院的同学小明毕业之后打算创业开餐馆。现在共有 n n n 个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 n n n 个地点排列在同一条直线…

c++中set用法

C 的 set 是一种容器&#xff0c;用于存储唯一的元素集合。它基于二叉搜索树的数据结构实现&#xff0c;并且内部使用红黑树来维护顺序和唯一性。以下是 set 容器的一些常见用法示例。 第一步是包含 <set> 头文件&#xff1a; cpp复制插入 #include <set>复制插入…

前端下载文件(链接 + zip等)

前端下载文件 zip文件 后端返回zip的二进制文件 // res为二进制文件 // 创建一个对象 URL const urlObject URL.createObjectURL(new Blob([res])) // 创建一个临时的 <a> 元素用于下载 const a document.createElement(a) a.style.display none a.href urlObjec…

Vue 项目中未登录状态如何统一处理

在 Vue 项目中&#xff0c;处理未登录状态&#xff08;比如用户访问需要登录的页面时&#xff09;是一项常见的需求。为了实现这一需求&#xff0c;我们通常使用 Vue Router 配合 Vuex 或者 Vue 的全局状态管理来统一处理未登录的状态&#xff0c;确保用户只能访问允许的页面。…

03_Django视图

三、Django模板 模板Templates 在Django框架中&#xff0c;模板是可以帮助开发者快速生成呈现给用户页面的工具 模板的设计方式实现了我们MVT中VT的解耦(M:Model&#xff0c;V:View&#xff0c;T:Template)&#xff0c;VT有着N:M的关系&#xff0c;一个V可以调用任意T&#xf…

iOS视图控制器的生命周期及各阶段的作用

iOS视图控制器&#xff08;UIViewController&#xff09;的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机&#xff0c;这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…

HTML5系列(10)-- 地理位置服务指南

前端技术探索系列&#xff1a;HTML5 地理位置服务指南 &#x1f30d; 致读者&#xff1a;探索位置服务的魅力 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 的地理位置服务&#xff08;Geolocation API&#xff09;&#xff0c;这项强大的功能让我们能…

美畅物联丨智能监控,高效运维:视频汇聚平台在储能领域的实践探索

在当今全球能源格局不断变化的大背景下&#xff0c;对清洁能源的需求正以惊人的速度增长。储能项目作为平衡能源供需、提升能源利用效率的关键环节&#xff0c;其规模和复杂度也在不断攀升。在储能项目的运营管理过程中&#xff0c;安全监控、设备运维以及数据管理等方面面临着…

Maven 详解

Maven 详解 Maven 是一个强大的项目管理和构建工具&#xff0c;主要用于 Java 项目。Maven 基于 Project Object Model (POM)&#xff0c;通过描述项目结构、依赖关系、插件和构建生命周期&#xff0c;帮助开发者高效管理项目的构建过程。 1. Maven 的核心概念 1.1 POM&#…

提升用户体验、创新产品与高效运营,企业发展三驾马车

​在当今竞争激烈的市场环境中&#xff0c;企业要想脱颖而出并持续发展&#xff0c;需同时在提升用户体验、推动产品创新以及实现内部高效运营方面下功夫。 提升用户体验至关重要。它能提高用户满意度和忠诚度&#xff0c;增加用户口碑与推荐&#xff0c;提升企业品牌形象。可通…

基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群 在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点&#xff0c;集群不具有高可用性。 HDFS 高可用架构 HDFS 高可用架构主要组件&#xff1a; Active NameNode 和 Standby NameNode&#xff1a; 两台 NameNode…

机器学习—学习过程

给定训练集构建决策树的过程有几个步骤。 给出了一组由十个猫和狗的例子组成的训练集&#xff0c;决策树学习的第一步是我们必须决定在根节点使用什么特性&#xff0c;这是决策树顶部的第一个节点&#xff0c;通过一个算法&#xff0c;假设我们决定选择根节点中的特性&#xf…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一个n行m列的矩阵A&#xff0c;输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵A的行数和列数。…

GPT 1到4代的演进笔记

1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…

JDK17 下载与安装

下载安装包 针对不同的操作系统, 需要下载对应版本的 JDK. 如果电脑是 Windows32 位的, 建议重装系统, 重装成 64 位的操作系统. 因为 Java 从 9 版本开始, 就已经不提供 32 位版本的安装包了. 官网下载 官网下载链接 需要登录 Oracle 账号才能下载. 账号: 2872336204qq.c…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展&#xff0c;而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 &#xff08;PCB&#xff09; 的检测和分析。本文…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 &#xff0c;学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库&#xff0c;常见的内置库&#xff08;random、hashlib、json、时间、os&#xff09; 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…