目录

 正则表达式:

match()函数:

search()函数:

findall()函数:

正则表达式的参数:

表示字符范围的参数:

表示字符出现的次数的参数:

表示同一类字符的参数:

贪婪和非贪婪模式:

或和组:

sub()和complie()方法:


 正则表达式

正则表达式(Regular Expression,re)是一种用于对字符串类型数据 进行高效的搜索、替换的操作。

其主要的匹配字符串的函数有三种:match(), search(),findall()

函数匹配范围返回结果常见用途
match()字符串起始位置匹配的对象 或 None验证字符串是否以特定字符开头
search()整个字符串第一个匹配的对象 或 None查找字符串中是否存在某个字符
findall()整个字符串所有匹配的字符串 或 元组列表提取文本中所有符合条件的内容

match()函数:

1.

import re
message = '张三、李四、王五、赵六'
result = re.match('张三',message) #从参数2中查找满足参数1的内容
print(result)

运行结果:

<re.Match object; span=(0, 2), match='张三'>

解析:re.match()从字符串起始位置匹配正则表达式。此处 “张三” 位于message开头,匹配成功,返回包含匹配位置(span=(0,2))和匹配内容的Match对象。


2.

import re
message = '张三、李四、王五、赵六'
result = re.match('三',message) #起始位置匹配不成功的话,就返回none
print(result)

运行结果:

None

解析:re.match()仅从字符串开头匹配。message开头是 “张”,而非 “三”,匹配失败,返回None

search()函数:

import re
message = '张三、李四、王五、赵六、王五'
result = re.search('王五',message)
print(result)

运行结果:

<re.Match object; span=(6, 8), match='王五'>

解析:re.search()在字符串任意位置查找第一个匹配的项。第一个 “王五” 位于索引 6-8 的位置,因此返回该位置的匹配对象。

findall()函数:

import re
message = '张三、李四、王五、赵六、王五'
result = re.findall('王五',message)#从参数2中查找满足参数1的所有内容
print(result)

运行结果:

['王五', '王五']

解析:re.findall()返回所有匹配的内容,以列表形式呈现。message中出现两次 “王五”,因此列表包含两个元素。

正则表达式的参数:

表示字符范围的参数:

[abc]:字符集合匹配,即匹配 abc 中的 任意一个字符。

[a-z]:范围匹配,即匹配指定范围内的 任意一个字符。

import re
message = 'Python93,C87,Java63,C++88'
result_1 = re.search('[cn]',message)
result_2 = re.findall('[0-9]',message)
result_3 = re.findall('[cn][0-9]',message)  # 匹配字母c或n后接数字的组合
print(result_1,result_2,result_3)

运行结果:

<re.Match object; span=(5, 6), match='n'> 
['9', '3', '8', '7', '6', '3', '8', '8'] ['n9']

解析:

  • [cn]匹配字母cnmessage中第一个符合的是Python中的n(索引 6)。
  • [0-9]匹配所有数字,提取出字符串中所有单个数字。
  • [cn][0-9]匹配cn后接数字的组合,仅Python93中的n9符合。

表示字符出现的次数的参数:
符号含义示例与等价形式
*匹配前面的子表达式任意次(≥0 次)。ab* 可匹配 "a", "ab", "abb" 等。
+匹配前面的子表达式至少一次(≥1 次)。ab+ 可匹配 "ab", "abb",但不匹配 "a"。
?匹配前面的子表达式零次或一次(0 或 1 次)。ab? 可匹配 "a" 或 "ab"。
^匹配输入字符串的开始位置。^Hello 仅匹配以 "Hello" 开头的字符串。
$匹配输入字符串的结束位置。world$ 仅匹配以 "world" 结尾的字符串。
{n}精确匹配前面的子表达式 n 次(n 为非负整数)。a{3} 仅匹配 "aaa"。
{n,}至少匹配前面的子表达式 n 次(n 为非负整数)。a{2,} 可匹配 "aa", "aaa" 等。
{n,m}最少匹配 n 次且最多匹配 m 次(n ≤ m,且均为非负整数)。a{1,3} 可匹配 "a", "aa", "aaa"。

示例1:

import re
message = 'da2a7ddbre77yifed777ttt3fefd7777b'
result = re.findall('[a-z]*[0-9][a-z]',message)
print(result)  
result = re.findall('[a-z]+[0-9][a-z]',message)
print(result) 
result = re.findall('[a-z]?[0-9][a-z]',message)
print(result) 

运行结果:

['da2a', '7d', '7y', '7t', 'tt3f', '7b']
['da2a', 'ttt3f']
['a2a', '7d', '7y', '7t', 't3f', '7b']

解析:正则表达式[a-z]*[0-9][a-z]表示:

  • [a-z]*:0 个或多个小写字母;
  • [0-9]:1 个数字;
  • [a-z]:1 个小写字母。
    匹配结果为包含 “数字前后有字母” 的片段。

示例2:

import re
phone_num = input("请输入您的手机号码:")
result = re.findall('^1[0-9]{10}$',phone_num)
print(result)

运行结果(输入13155558888时):

['13155558888']

解析:正则^1[0-9]{10}$验证手机号:

  • ^1:以 1 开头;
  • [0-9]{10}:紧跟 10 个数字;
  • $:结束符(确保无多余字符)。
    匹配成功返回手机号列表,失败返回空列表。

错入输入无法匹配:

如果去掉 "$" ,就不再有输入位数限制:(即匹配足够的数字后停止)

示例3:

import re
QQ_number = input("请输入您的QQ号:")
result = re.match('[1-9][0-9]{4,10}$',QQ_number)
print(result)

运行结果(输入123456时):

<re.Match object; span=(0, 6), match='123456'>

解析:正则[1-9][0-9]{4,10}$验证 QQ 号:

  • [1-9]:首位不为 0;
  • [0-9]{4,10}:后续 4-10 个数字(总长度 5-11 位)。
    re.match()从开头匹配,符合则返回匹配对象,否则返回None

示例4:

import re
use_name = input("请输入您的用户名:")
result = re.findall('^[A-Za-z_][A-Za-z0-9_]{7,}$',use_name)
print(result)

运行结果(输入User_1234时):

['User_1234']

解析:正则验证用户名规则:

  • 首位为字母或下划线;
  • 后续为字母、数字或下划线,且总长度≥8 位。
    匹配成功返回用户名列表,否则返回空列表。

 错误输入无法匹配:

表示同一类字符的参数:
元字符描述等价于
\d匹配一个数字类字符[0-9]
\D匹配一个非数字类字符(^ 在中括号中表示 “非”)[^0-9]
\s匹配任何不可见字符,包括空格、制表符、换页符等[\f\n\r\t\v]
\S匹配任何可见字符[^\f\n\r\t\v]
\w匹配包括下画线的任何单词字符[A-Za-z0-9_]
\W匹配任何非单词字符[^A-Za-z0-9_]
\b匹配一个单词的边界,即单词和空格间的位置
\B匹配非单词边界
\f匹配一个分页符
\n匹配一个换行符
\r匹配一个 Enter 键符
\t匹配一个制表符
\v匹配一个垂直制表符
.匹配除 “\n” 和 “\r” 之外的任何单个字符

示例1:

import re
use_name = input("请输入您的用户名:")
result = re.findall('^[A-Za-z_]\w{7,}$',use_name)
print(result)

运行结果(输入User_1234时):

['User_1234']

解析:\w任何单词字符等价于[A-Za-z0-9_]

示例2:

import re
message = 'verb very never every aer_'
result = re.findall(r'\w+er\B',message)
print(result)

运行结果:

['ver', 'ver', 'ever', 'aer']

解析:

\w+er:匹配以er结尾的单词片段;

\B:非单词边界(即er后紧跟其他字符,不是空格或结尾)。

示例3:

import re
message = 'verb very never every'
result = re.findall('.e',message)
print(result)

运行结果:

['ve', 've', 'ne', 've', ' e', 've']

解析:.匹配任意字符(除换行、回车),'e'匹配字母e,因此.e匹配 “任意字符 + e” 的组合。

贪婪和非贪婪模式:

贪婪模式:

尝试匹配尽可能多的字符,只要满足表达式要求都会匹配最多的字符

非贪婪模式:

一旦满足表达式要求就不再继续匹配。在次数限制操作符后面加上“?”可以将匹配模式转换为非贪婪模式。

示例1:

import re
message = 'ccc739134792hdccc1'
result = re.findall('ccc\d+',message)
print(result)

运行结果:

['ccc739134792', 'ccc1']

解析:\d是数字类字符,+是>=1次。为贪婪模式,匹配尽可能多的数字。

示例2:

import re
message = 'ccc739134792hd'
result = re.findall('ccc\d+?',message)
print(result)

运行结果:

['ccc7']

解析:\d是数字类字符,+是>=1次,?是0次或1次,三者结合后意思是匹配 一个数量类字符。为非贪婪模式

如果去掉加号:

或和组:

示例1:

或:符合两种情况的匹配

import re
message = 'verb very never every'
result = re.findall('\w+ev|\w+ry',message)
print(result)

运行结果:\w包括下画线的任何单词字符

['very', 'nev', 'every']

示例2:

将()中的表达式定义为组,并且将匹配这个表达式的字符保存到一个临时区域,即捕获匹配的内容

import re
message = 'verb very never every'
result = re.findall("e(.+)(.)r",message)
print(result)

运行结果:

[('rb very never ev', 'e')]

解析:()表示分组,e(.+)(.)r匹配:

  • e开头,以r结尾;
  • 第一个分组(.+):匹配er之间的多个字符;
  • 第二个分组(.):匹配r前的单个字符。

sub()和complie()方法:

示例1:

re.sub() 用于在字符串中查找匹配正则表达式的部分,并替换为指定的内容

import re
content ='dh932hf9f934hfnf39d'
content = re.sub('\d','0',content)
print(content)

运行结果:

dh000hf0f000hfnf00d

解析:re.sub('\d','0',content)将字符串中所有数字(\d)替换为0,非数字字符保持不变。

示例2:

re.compile() 用于 预编译正则表达式,提高多次匹配时的效率(避免重复解析正则表达式)。

import re
contentl ='2020 12 15 12:00'
pattern = re.compile('\d{2}:\d{2}')
print(pattern.findall(contentl))  

运行结果:

['12:00']

解析:re.compile('\d{2}:\d{2}')编译正则表达式(匹配 “两位数字:两位数字” 的时间格式),再通过pattern.findall()从字符串中提取所有符合格式的内容,此处仅12:00符合。

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

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

相关文章

事件驱动设计:Spring监听器如何像咖啡师一样优雅处理高并发

架构哲学&#xff1a;当咖啡店面对汹涌客流时&#xff0c;真正的优雅不是更快的动作&#xff0c;而是科学的协作机制。Spring事件驱动正是通过发布-订阅模式&#xff0c;让系统像顶级咖啡师般从容应对突发流量。一、从咖啡店看监听器本质&#xff1a;3大核心组件拆解 场景还原&…

C++ const 关键字解析

const 是 C 中用于定义常量或指定不可变性的关键字&#xff0c;它在不同上下文中有不同的含义和用法。下面是对 const 的全面解析&#xff1a;1. 基本用法定义常量const int MAX_SIZE 100; const double PI 3.14159;这些值在程序运行期间不能被修改必须在定义时初始化与指针结…

[es自动化更新] Updatecli编排配置.yaml | dockerfilePath值文件.yml

链接&#xff1a;https://github.com/elastic/elasticsearch/tree/main/build-conventions elasticsearch自动化更新 本专栏使用updatecli实现自动化版本更新与依赖管理。 其配置通过编排文件&#xff08;updatecli-compose.yaml&#xff09;实现&#xff0c;该文件罗列了称…

新手向:使用Python将多种图像格式统一转换为JPG

本文将详细解析一个专业的Python脚本&#xff0c;它能够将指定文件夹中的所有非JPG格式图像批量转换为JPG格式。这个脚本虽然代码量不大&#xff0c;但包含了文件操作、图像处理、异常处理等多个重要编程概念&#xff0c;非常适合初学者系统学习。环境准备在开始之前&#xff0…

深入剖析C++ RPC框架原理:有栈协程与分布式系统设计

深入剖析C RPC框架原理&#xff1a;有栈协程与分布式系统设计 &#x1f6e0;️ 第一部分&#xff1a;RPC框架核心原理与技术架构 &#x1f310; 1.1 RPC在分布式系统中的核心地位 远程过程调用&#xff08;RPC&#xff09;是现代分布式系统的基石&#xff0c;它实现了&#xf…

基于springboot+Vue的二手物品交易的设计与实现

基于springbootVue的二手物品交易的设计与实现 作者&#xff1a; Mr顺 | 某大厂全栈开发工程师 | CSDN新星计划导师 | Java领域优质创作者 技术栈&#xff1a; SpringBoot, JavaWeb, 数据库等。精通Java、微信小程序开发。 项目亮点&#xff1a; 完整可运行&#xff1a; 提供…

腾讯云轻量服务器创建快照免费API接口教程

接口简介 该API用于腾讯云轻量服务器系统盘快照创建&#xff0c;无需关机即可自动删除旧快照并创建新快照。特点包括&#xff1a; 不占用腾讯云快照配额支持自动备份策略适用于定时备份任务仅支持系统盘快照&#xff08;云硬盘需调用专用接口&#xff09; ​请求地址​ https…

C++中的智能指针(1):unique_ptr

一、背景普通指针是指向某块内存区域地址的变量。如果一个指针指向的是一块动态分配的内存区域&#xff0c;那么即使这个指针变量离开了所在的作用域&#xff0c;这块内存区域也不会被自动销毁。动态分配的内存不进行释放则会导致内存泄漏。如果一个指针指向的是一块已经被释放…

HTTPS安全机制:从加密到证书全解析

目录 1.HTTPS是什么 2.加密是什么 3.HTTPS的加密过程 3.1对称加密 3.2非对称加密 4.引入证书 4.1"中间人"攻击 4.2 引入证书机制 4.3 理解数据签名 4.4 非对称加密 对称加密 证书认证 5.常见问题 5.1 Fiddler等抓包工具&#xff0c;为啥能解析HTTPS的数据…

2024年深度学习技术主要发展分析

摘要&#xff1a;深度学习作为人工智能领域的战略级技术&#xff0c;在2024年持续取得突破性进展&#xff0c;持续重构现代战争规则&#xff0c;成为大国军事智能化竞争的核心角力点。对2024年深度学习技术热门领域的主要发展进行了综合评述。研究了深度学习技术的发展现状&…

Swift 枚举:深入理解与高效使用

Swift 枚举:深入理解与高效使用 引言 Swift 枚举(Enum)是 Swift 编程语言中的一种基本数据类型,它允许我们将一组相关的值组合在一起。枚举在 Swift 中有着广泛的应用,从简单的数据分类到复杂的业务逻辑处理,枚举都能发挥巨大的作用。本文将深入探讨 Swift 枚举的原理、…

从大模型到云游戏,国鑫SY8108G-G4如何化身“全能AI引擎”?

当大模型参数量突破万亿级&#xff0c;传统服务器在散热枷锁与扩展瓶颈前举步维艰。国鑫全新推出的 SY8108G-G4 8U8卡AI服务器 &#xff0c;以颠覆性架构支持8张600W GPU全速并行&#xff0c;结合CPU-GPU直连、冗余电源和弹性扩展三大优势&#xff0c;为AI训练、生成式创作、数…

在多个DHCP服务器的网络环境中选择指定的DHCP服务

问题 学校有两个网络&#xff0c;我电脑网线插在同一个交换机的同一个接口上&#xff0c;有时候获取的是172.27开头的IP&#xff0c;有时候获取的是192.168开头的IP。 通常第一次开机获取的是172.27的IP&#xff0c;插拔网线或重启网络接口后会变为192.168的IP。 两个网络各有…

【Nginx】实测Nginx增加第三方主动式健康检查模块

一、环境说明系统版本&#xff1a;CentOS 7.9内核版本&#xff1a;3.10.0-1160.119.1Nginx版本&#xff1a;1.26.3第三方检测模块及版本&#xff1a;nginx_upstream_check_module&#xff08;v0.4.0&#xff0c;兼容nginx 1.20&#xff09;二、nginx安装部署2.1 下载检测模块目…

pytest中mark的使用

在pytest中&#xff0c;mark&#xff08;标记&#xff09;是用于对测试用例进行分类、筛选或附加元数据的重要功能。以下是其核心使用方法&#xff1a; 1. ‌基本标记定义与使用‌ ‌注册标记‌&#xff1a;在pytest.ini中预先定义标记&#xff08;避免运行时警告&#xff09;&…

STM32N6--NPU简单介绍

关键词&#xff1a;STM32N6、生物神经元、神经网络处理单元&#xff08;NPU&#xff09;、数据流处理 参考链接&#xff1a; RM0486 Reference manual STM32N647/657xx Arm-based 32-bit MCUsST_中文论坛【资料合集】STM32N6超全资料合集&#xff08;定期更新&#xff09;B站_…

一款开源免费、通用的 WPF 主题控件包

前言 今天大姚给大家分享一款开源免费&#xff08;MIT License&#xff09;、通用的 WPF 主题控件包&#xff1a;Rubyer WPF。 WPF介绍 WPF是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动…

windows安装python环境以及对应编辑器的详细流程

windows安装python环境以及对应编辑器的详细流程 一、安装 Python 环境 步骤 1&#xff1a;下载 Python 安装包 访问 Python 官网&#xff1a;https://www.python.org/downloads/windows/选择最新稳定版本&#xff08;如 Python 3.12.x&#xff09;&#xff0c;点击 Download W…

高保真组件库:下拉多选

制作一个高保真的下拉多选需要具备多种交互事件。 拖拽一个文本框并命名为“下拉文本输入框”和一个向下的箭头组合在一起,外观上看起来是下拉组件。为了美观调整一些边框颜色、圆角、文字左边距等。 拖拽一个矩形作为下拉选项的容器,启动阴影xy都为0 制作下拉选项:拖拽一个…

sqli-labs靶场通关笔记:第1-4关 联合注入

第1关&#xff1a;单引号闭合1.这是第1关的界面&#xff0c;让我们以id作为参数输入&#xff0c;方式为数值&#xff0c;这里输入?id1看一下。2.显示了id1的用户名和密码。分析&#xff1a;在sql注入漏洞中&#xff0c;第一步是要寻找注入点&#xff0c;即可以输入参数的地方&…