【新人系列】Python 入门(十六):正则表达式

✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪

在线正则表达式测试:https://tool.oschina.net/regex/#

1. 正则表达式详解

介绍

正则表达式是一种用于匹配和操作文本的规则或语法:

  • 正则表达式拥有强大的文本处理能力,支持匹配、查找、替换等操作
  • 广泛的应用领域,例如编程、数据处理、文本处理等领域
  • 通用性强,跨语言跨场景

语法

在这里插入图片描述

2. 正则表达式实战

案例一

现在有这样一串字符,我需要根据需求查找出相应的字符信息。

hello world 12345 is book 123
  1. 匹配出 hello 字符串
    1. 方法一:hello
    2. 方法二:^hello
  2. 匹配出所有数字
    1. 方法:\d+
  3. 匹配出所有字符串
    1. 方法:[a-zA-Z]+

案例二

要求写一个正则表达式,用来匹配邮箱,而邮箱规则如下:

  • 结构:前缀@后缀
  • 前缀:由大小写字母、数字、下划线、中划线等构成
  • 后缀:由小写字母或数字构成,并以 .com 结尾
123@qq.com
test@email.com
xxx@123.com

匹配邮箱的正则表达式:

  1. 匹配单个邮箱
    1. 方法:^[a-zA-Z0-9_-]+@[a-z0-9]+.com$
  2. 匹配多个邮箱
    1. 方法:[a-zA-Z0-9_-]+@[a-z0-9]+.com

3. Python 正则表达式用法 - re 模块

3.1 re.search( )

在字符串中搜索匹配正则表达式的第一个位置。

import retext = "Hello, World!"
result = re.search('World', text)# 找到匹配
if result:print("找到匹配")print(result)    # <re.Match object; span=(7, 12), match='World'>print(result.span())     # (7, 12)print(result.group())    # World
else:print("未找到匹配")

3.2 re.match( )

用于从字符串的起始位置匹配正则表达式,如果起始位置匹配成功,则返回一个匹配对象;否则返回 None。

import retext = "Hello World"
result = re.match('Hello', text)# 匹配成功
if result:print("匹配成功")print(result)    # <re.Match object; span=(0, 5), match='Hello'>print(result.span())     # (0, 5)print(result.group())    # Hello
else:print("匹配失败")

Tips:
re.match() 只从字符串的起始位置进行匹配,而 re.search() 则会在字符串中搜索匹配的部分,不限于起始位置。

再看个复杂点的正则表达式,进一步理解一下 match 和 search 函数的区别。

# !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author:gdx
# @File:test.py.py
# @Project:test_pythonimport re# 匹配1
text1 = "@#@!¥123_23134@qq.com"
result = re.match('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text1)
# 匹配失败
if result:print("匹配成功")print(result)print(result.group())
else:print("匹配失败")# 匹配2
result = re.search('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text1)
# 匹配成功
if result:print("匹配成功")print(result)  # <re.Match object; span=(5, 21), match='123_23134@qq.com'>print(result.group())  # 123_23134@qq.com
else:print("匹配失败")# 匹配3
text2 = "123_23134@qq.com"
result = re.match('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text2)
# 匹配成功
if result:print("匹配成功")print(result)    # <re.Match object; span=(0, 16), match='123_23134@qq.com'>print(result.group())    # 123_23134@qq.com
else:print("匹配失败")

3.3 re.findall( )

返回字符串中所有匹配正则表达式的子串。

import retext = "apple, banana, cherry"
matches = re.findall('a[a-z]+', text)   # ['apple', 'anana']
print(matches) 

3.4 re.compile( )

re.complile() 用于编译正则表达式模式,生成一个正则表达式对象。这个对象可以被多次使用,从而提高效率。它接受一个字符串形式的正则表达式作为参数,并返回一个编译后的正则表达式对象。

除了前面提到的可以直接使用编译后的对象调用 findall 等方法之外,还可以设置一些标志参数来影响正则表达式的匹配行为。

常见的标志参数有:

  • re.IGNORECASE 或 re.I :使匹配对大小写不敏感。
  • re.MULTILINE 或 re.M :多行模式,影响 ^ 和 $ 的匹配行为。
  • re.DOTALL 或 re.S :使 . 匹配包括换行符在内的所有字符。
import repattern = re.compile('hello', re.IGNORECASE)
text = "Hello World"
result = pattern.search(text)
if result:print("找到匹配")print(result)    # <re.Match object; span=(0, 5), match='Hello'>print(result.group())    # Hello
else:print("未找到匹配")

可以再来看一个分割字符串的例子。

import redata_list=['2小时10分20秒','3小时20分30秒','1小时10分5秒'
]
pattern = re.compile('小时|分|秒')
for i in data_list:res = pattern.split(i)print(res)"""['2', '10', '20', '']['3', '20', '30', '']['1', '10', '5', '']"""

3.5 ( ) 分组

使用括号 () 进行分组,可以提取匹配的子串。

import repattern = re.compile(r"(\d{3})-(\d{3})-(\d{4})")
text = "My phone number is 123-456-7890"
result = pattern.search(text)
if result:print(result.group(1))   # 123print(result.group(2))   # 456print(result.group(3))   # 7890

Tips:
这里的 r 表示原始字符串,避免一些字符需要额外的转义。

3.6 re.sub( )

使用 re.sub() 函数可以进行替换操作。

import retext = "Hello, World!"
new_text = re.sub('World', 'Python', text)
print(new_text)  # Hello, Python!

我们再结合前面的分组方法看一个更复杂点的例子,我想要将一串手机号的中间 4 个数字进行加密处理,我们

import re# 方法一:分两组
pattern = re.compile(r"(\d{3})\d{4}(\d{3})")
text = "我有几个手机号分别是:1361234567,1331234567,1797654321"
new_text = pattern.sub(r"\1****\2", text)
print(new_text)  # 我有几个手机号分别是:136****567,133****567,179****321# 方法二:分三组
pattern = re.compile(r"(\d{3})(\d{4})(\d{3})")
text = "我有几个手机号分别是:1361234567,1331234567,1797654321"
new_text = pattern.sub(r"\1****\3", text)
print(new_text)  # 我有几个手机号分别是:136****567,133****567,179****321

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

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

相关文章

人工智能增强的音频和聊天协作服务

论文标题&#xff1a;AI-enabled Audio and Chat Collaboration Services 中文标题&#xff1a;人工智能增强的音频和聊天协作服务 作者信息&#xff1a; Emil P. Andersen, Norwegian Defence Research Establishment (FFI), Kjeller, NorwayJesper R. Goksr, Sindre E. Ha…

【原创】- 澳门预约医疗系统 - 一个基于Vue3编写的程序

在空余时间写了一个前端预约医疗系统&#xff0c;用Vue3写的一套前端模块&#xff0c;里面数据都是本地模拟&#xff0c;一个练手的简单项目。 此项目主要功能有&#xff1a; 1.预约挂号、挂号记录 2.疫苗接种 3.就医记录 4.科室导航 5.AI问诊 6.个人病例 7.支付可配置化 8.健康…

Cadence学习笔记 3 MCU主控原理图绘制

基于Cadence 17.4&#xff0c;四层板4路HDMI电路 更多Cadence学习笔记&#xff1a;Cadence学习笔记 1 原理图库绘制Cadence学习笔记 2 PCB封装绘制 目录 3、MCU主控原理图绘制 快捷键总结&#xff1a; 3、MCU主控原理图绘制 新建原理图Design&#xff0c;选择好SCH文件夹&…

vue2实现答题组件

需求 实现一个答题组件&#xff0c;点击正确的选项&#xff0c;该选项背景变绿色&#xff1b;点击错误的选项&#xff0c;该选项背景变红色。不管点击了什么选项&#xff0c;延迟一秒后切换下一题。 每次出题&#xff0c;从题库中选随机选择一道用户此次进入这个页面后还没有…

3D相框案例讲解(详细)

前言 通过现阶段的学习&#xff0c;我们已经掌握了HTML&#xff0c;CSS和JS部分的相关知识点&#xff0c;现在让我们通过一篇案例&#xff0c;来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…

SuperMap GIS基础产品FAQ集锦(20241216)

一、SuperMap iDesktopX 问题1&#xff1a;想问一下 SuperMap iDesktopX可以修改倾斜入库后数据的位置吗 11.2.1 【解决办法】在配置文件&#xff08;*.scp&#xff09;中找打position属性&#xff0c;修改其中的xyz值&#xff0c;用于改变位置&#xff1b;修改后如果想要相机…

2.11.静态链表

一.静态链表的基本概念&#xff1a; 1.上图说明&#xff1a;索引为0处是头结点&#xff0c;头结点不存储数据&#xff0c;但存储下一个结点的数组下标&#xff0c;本例中头结点里存储的下一个结点的数组下标为2&#xff0c;即索引为2的结点为头结点后的第一个结点&#xff0c;以…

【Childishness and Playfulness】

奥迪双钻&#xff0c;旋风冲锋龙卷风&#xff0c;巨无霸 智能芯片 东西南北中&#xff0c;好像已经忘了怎么折叠了&#xff0c;折千纸鹤&#xff0c;折小船&#xff0c;折舞狮&#xff0c;折飞机 红外线小灯&#xff0c;纽扣电池&#xff0c;各种形状投影 爷爷的手电筒&am…

【C++初阶】第9课—标准模板库STL(string_3)

文章目录 1. string类对象的查找操作1.1 c_str返回c格式字符串1.2 substr获取string类对象子串1.3 find和rfind查找字符串内容1.4 find_first_of与find_first_not_of1.5 find_last_of与find_last_not_of1.6 copy复制string类对象内的字符串内容1.7 compare对比string类字符串1.…

【教程】如何下载WandB平台的运行数据?

【教程】如何下载WandB平台的运行数据&#xff1f; 前言 CSDN主页&#xff1a;https://blog.csdn.net/rvdgdsva 博客园主页&#xff1a;https://www.cnblogs.com/hassle Weights & Biases (WandB)是一个用于机器学习的平台&#xff0c;它提供了一套工具来帮助你跟踪、比…

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…

【Linux】自定义项目-进度条

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 准备工作&#xff1a;"\r"与"\n"字符 ①&#xff1a;基本含义 在C语言和Linux环境中&#xff0c;\r是回车符&#xff0c;\n是换行符&#xff0c;用于控制文本格式和输出…

Linux从0到1——初识线程【什么是线程/线程控制/详解tid】

Linux从0到1——初识线程 1. 什么是线程&#xff1f;1.1 线程的概念1.2 结合代码理解线程1.3 重谈地址空间1.4 线程的优缺点 2. 线程异常和线程用途3. Linux进程VS线程4. 详解pthread_create的arg参数4.1 给线程传参4.2 一次创建多个线程 5. 线程控制5.1 线程退出5.2 线程分离5…

[免费]SpringBoot+Vue校园社团管理系统(优质版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园社团管理系统(优质版)&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园社团管理系统(优质版) Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的迅速发展&#x…

114 二叉树展开为链表

解题思路&#xff1a; \qquad 题目中已经明确&#xff0c;要用先序遍历的顺序展开&#xff0c;那么就需要按照“中-左-右”的顺序遍历二叉树&#xff0c;剩下的问题在于如何在遍历过程中完成链表指针的更新。 \qquad 由于“右子节点”需要链接到左子树最后一个节点之后&#…

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…

类OCSP靶场-Kioptrix系列-Kioptrix Level 1

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3 目录爆破 1.4. 敏感信息 2.根据服务搜索漏洞 2.1. 搜索exp 2.2. 编译exp 2.3. 查看exp使用方法&#xff0c;并利用 3. 提权 二、第二种方法 一、前情提要 Kioptrix Level是免费靶场&#x…

Golang囊地鼠gopher

开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…

快速上手Spring注解、SpringAop

1 Spring 注解的使用 1 IOC 的概念 IOC&#xff08;Inversion of Control&#xff09;&#xff1a;控制反转。 使用对象时&#xff0c;由主动new产生对象转换为由外部提供对象&#xff0c;此过程中对象创建控制权由程序转移到外部&#xff0c;此思想称为控制反转。通俗的讲就…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天&#xff0c;企业迎来了前所未有的发展机遇&#xff0c;规模迅速扩张&#xff0c;市场版图不断延伸。然而&#xff0c;伴随着这种快速的发展&#xff0c;一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…