正则表达式re简介

Python中的正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于匹配、查找、替换等复杂文本模式。
Python通过re模块提供了对正则表达式的支持。
基础概念

  1. 字符匹配:
    • .:匹配任意单个字符(除换行符)
    • \d:匹配数字,等价于[0-9]
    • \D:匹配非数字
    • \w:匹配字母数字及下划线,等价于[a-zA-Z0-9_]
    • \W:匹配非字母数字及下划线
    • \s:匹配任意空白字符,如空格、制表符等
    • \S:匹配非空白字符
  2. 量词:
    • *:前面的元素出现0次或多次
    • +:前面的元素出现1次或多次
    • ?:前面的元素出现0次或1次
    • {m}:前面的元素恰好出现m次
    • {m,n}:前面的元素至少出现m次,最多n次
  3. 边界匹配:
    • ^:匹配字符串开始
    • $:匹配字符串结束
    • \b:匹配单词边界
    • \B:匹配非单词边界
  4. 组与捕获:
    • (pattern):对pattern进行分组并捕获匹配的内容
    • (?:pattern):非捕获分组,只进行分组不捕获内容
  5. 特殊序列:
    • \n:换行符
    • \t:制表符
    • \:匹配反斜杠\

常用函数

  1. re.search(pattern, string): 在整个字符串中搜索匹配项,不局限于字符串的开始。只要在字符串中的任意位置找到一个匹配项,它就会停止搜索并返回第一个成功的匹配对象。
  2. re.match(pattern, string): 只在字符串的开始位置尝试匹配模式。如果字符串开始没有匹配到,则返回None,不会继续在字符串中的其他位置查找。
result5 = re.match(r'\d+', '123abc') # # 匹配一个或多个数字
print(result5.group()) # 123
result6 = re.match(r'\d+', 'def123abc')
print(type(result6)) # <class 'NoneType'>
result7 = re.search(r'\d+', 'def123abc')
print(result7.group()) #123
  1. re.findall(pattern, string): 返回字符串中所有与正则表达式匹配的所有非重叠匹配项的列表。
  2. re.sub(pattern, repl, string): 将字符串中匹配到的部分替换为指定的字符串。
text1 = 'Hello, my number is 123-456-7890.'
number = re.search(r'\d{3}-\d{3}-\d{4}', text1)
if number:print(f'My number is {number.group()}.') # My number is 123-456-7890.print(type(number)) # <class 're.Match'>text2 = 'My emails are example@126.com, example@test.cn and example@yahoo.com.cn'
emails = re.findall(r'[A-Za-z0-9._%+-]+@[A-Za-z0-9._-]+\.[A-Za-z]+(?:\.[A-Za-z]{2,})?', text2) # (?:\.[A-Za-z]{2,})? 是为了识别二级域名
# emails = re.findall(r'[A-Za-z0-9._%+-]+@[A-Za-z0-9._-]+\.[A-Za-z]+(?:\.[A-Za-z]+)?', text2)
print(emails) # ['example@126.com', 'example@test.cn', 'example@yahoo.com.cn']
print(type(emails)) # <class 'list'>text3 = "This is a test, replace the word 'test' with 'example'."
resuilt = re.sub(r'test', 'example', text3) # 返回替换后的文本
print(resuilt) # This is a example, replace the word 'example' with 'example'.
  1. re.split(pattern, string, maxsplit=0, flags=0):用于根据正则表达式来分割字符串
    • pattern: 一个字符串或编译好的正则表达式对象。这个模式定义了用来分割字符串的规则。
    • string: 需要被分割的原始字符串。
    • maxsplit: 可选参数,指定最大分割次数。默认为0,意味着不限制分割次数,只要满足条件就会一直分割。
    • flags: 可选参数,用于指定匹配模式,如忽略大小写、多行模式等。默认为0,即没有特殊匹配模式。
text4 = "Hello World! I\'m a robot."
result1 = re.split(r'\W+', text4) # 带+可以一并处理!和空格
print(result1) # ['Hello', 'World', 'I', 'm', 'a', 'robot', ''] 最后那个是空字符串,如果没有最后的标点.则没有这个空字符串
result2 = re.split(r'\W+', text4,maxsplit=2) # 通过设置maxsplit=2,限制了最多分割两次
print(result2) # ['Hello', 'World', "I'm a robot."]
result3 = re.split(r'(\w+)',text4) # 分隔符是字母,由于它被括号包围,所以也会作为结果的一部分被返回
print(result3) # ['', 'Hello', ' ', 'World', '! ', 'I', "'", 'm', ' ', 'a', ' ', 'robot', '.']
  1. re.finditer 用于在字符串中找到所有匹配正则表达式的子串,并返回一个迭代器,迭代器中包含的是匹配对象。每个匹配对象都包含了匹配到的字符串的信息,比如起始和结束位置等。
result4 = re.finditer(r'(\w+)', text4)
print(type(result4)) # <class 'callable_iterator'>
for i in result4:print(f'\'{i.group()}\' start: {i.start()}, end: {i.end()}, span: {i.span()}.')
# 'Hello' start: 0, end: 5, span: (0, 5).
# 'World' start: 6, end: 11, span: (6, 11).
# 'I' start: 13, end: 14, span: (13, 14).
# 'm' start: 15, end: 16, span: (15, 16).
# 'a' start: 17, end: 18, span: (17, 18).
# 'robot' start: 19, end: 24, span: (19, 24).
  1. re.subn(pattern, repl, string, count=0, flags=0) 方法与re.sub非常相似,也是用于替换字符串中匹配到的模式。不同之处在于,它返回一个元组(new_string, number_of_subs_made),其中new_string是替换后的新字符串,与re.sub返回的相同,而number_of_subs_made是一个整数,表示实际完成的替换次数。
text5 = 'Hello world! Hello Python!'
result8 = re.sub(r'Hello','Hi',text5)
print(result8) # Hi world! Hi Python!
result9 = re.subn(r'Hello','Hi',text5)
print(result9) # ('Hi world! Hi Python!', 2)

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

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

相关文章

rk3588 opencv 的使用

-------------------------------------------------------------------------------------------------------- 目前是 3588 上无法 直接编译出 C程序。 报错如下&#xff1a; -----------------------------------------------------------------------------------------…

82.【C语言】数据结构之顺序表的初始化和销毁

目录 1.线性表 2.分类 1.静态顺序表&#xff1a;使用定长数组存储元素 代码示例(写入Seqlist.h中) 2.动态顺序表:使用与动态内存管理有关的函数 代码示例(写入Seqlist.h中) 补:数据管理的四个需求:增改删查 3.操作顺序表 1.初始化顺序表 1.不开辟空间 2.开辟空间 1…

无人机之三维航迹规划篇

一、基本原理 飞行环境建模&#xff1a;在三维航迹规划中&#xff0c;首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析&#xff0c;以获得可行的飞行路径。 飞行任务需求分析&#xff1a;根据无人机的任务需求&#xff0c;确定航迹规划的…

分布式篇(分布式事务)(持续更新迭代)

一、事务 1. 什么是事务 2. 事务目的 3. 事务的流程 4. 事务四大特性 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 持久性&#xff08;Durability&#xff09; 隔离性&#xff08;Isolation&#xff09; 5. MySQL VS Oracle …

汇总10个AI免费一键生成PPT的网站

一、前言 PPT幻灯片是现代办公和学习中的重要组成部分。它在工作、研究或培训中扮演着重要角色&#xff0c;并能够让观众更好地理解信息。随着当今人工智能技术的快速发展&#xff0c;现在有很多免费的AI PPT生成器可供选择&#xff0c;帮助用户更加便捷地制作出高效且具有较强…

基于SpringBoot+Vue+uniapp微信小程序的宿舍报修系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Qt获取磁盘信息+表格显示

效果展示 主要代码 获取磁盘相关数据 获取磁盘数据 Qt 没有提供相关的接口&#xff0c;需要使用 Windows API。接口解释如下&#xff1a; BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailable…

GPIO口的学习

推挽输出 用它去控制一个mos管&#xff0c;当输出高电平时电流这样流出去&#xff0c;给外面的这颗mos管的栅极充电&#xff0c;所以这个过程称为推把电流推出去 然后当IO口输出低电平时电流这样流进来,给外面的这颗mos管的栅极放电,那这就是挽&#xff0c;把电流挽回来,所以所…

【汇编语言】寄存器(内存访问)(七)—— CPU提供的栈机制

文章目录 前言1. CPU提供的栈机制2. push指令3. 问题4. 问题的分析与解答5. pop指令结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深…

fmql之Linux Uart

正点原子第48章。 串口收发测试 正点原子教程 RS232和RS485的串口收发测试是一样的。 // 设置串口波特率为115200 stty -F /dev/ttyPS1 ispeed 115200 ospeed 115200 cs8// 发送字符串 echo "www.openedv.com" >/dev/ttyPS1// 接收数据 cat /dev/ttyPS1 fmql测…

强烈推荐Kafka动画入门概念的3个讲座

强烈推荐Kafka动画入门概念的3个讲座&#xff0c;3个都是动画讲解&#xff0c;十分不错&#xff0c; 1、主题、偏移量和分区 ~ Kafka核心概念(Part1) 地址&#xff1a;主题、偏移量和分区 ~ Kafka核心概念(Part1)_哔哩哔哩_bilibili 2、偏移量提交、重平衡和消费者组 ~ Kafka核…

C Primer Plus 第9章——第一篇

你该逆袭了 文章目录 一、复习函数1、定义带形式参数的函数2、声明带形式参数函数的原型3、使用 return 从函数中返回值&#xff08;1&#xff09;、返回值不仅可以赋给变量&#xff0c;也可以被用作表达式的一部分。&#xff08;2&#xff09;、返回值不一定是变量的值&#x…

【Linux】进程池

目录 进程池 进程池的概念&#xff1a; 手搓进程池&#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念&#xff1a; 定义一个池子&#xff0c;在里面放上固定数量的进程&#xff0c;有需求来了&#xff0c;就拿一个池中…

微信小程序考试系统(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序考试系统的开发全过程。通过分析微信小程序考试系统管理的不足&#xff0c;创建了一个计算机管理微信小程序考试系统的方案。文章介绍了微信小程序考…

Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树 二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空)&#xff0c;其中每个节点都有一个值&#xff0c;并且满足以下特点&#xff1a; 定义&#xff1a; 左子树节点的值小于根节点的值&#xff1a;对于每个节点&#xff0c;左子树中所…

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…

Vscode的远程开发之VScode优势(一)

一、VSCode 优势 时代的弄潮儿 vscode是微软开源的基于electron的编辑器&#xff0c;通过各种各样的插件&#xff0c;它能够变成你最花里胡哨的IDE。 vscode 最大的特点与优势就是它将Server与Client解耦&#xff1a; 作为Client的vscode&#xff0c;他只负责作为文本编辑器…

kali的学习

一、Namp的使用 首次使用时&#xff0c;要确保Metasploitable已经启动并正在运行 nmap扫描原理&#xff1a; 首先判断nmap传输的命令行中是否包含域名&#xff0c;如果包含需要利用DNS服务器进行域名分析&#xff0c;然后发送ICMP Echo Request 来探测主机存活性。 nmap默认扫描…

判断在子集

今天晚上练习赛的A没写括号&#xff0c;搞了好久&#xff0c;真的是醉了。。。 #include<bits/stdc.h> using namespace std; typedef long long ll; int t; int main() {cin>>t;while(t--){ll x,y;cin>>x>>y;if(x<y)swap(x,y);if(xy)cout<<0…

构建现代化车辆管理系统:SpringBoot实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理车辆管理系统的相关信息成为必然。开发合适…