什么是正则表达式,如何在 Python 中使用?

什么是正则表达式

正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符模式的工具。它是由普通字符(例如字母、数字)以及一些特殊字符(称为元字符)组成的字符序列。这种模式用于在文本中搜索、匹配和替换字符串。

正则表达式是一种强大的文本处理工具,可以用来验证输入、搜索匹配、替换字符串以及解析复杂的文本格式。由于其灵活性和强大的功能,正则表达式被广泛应用于各种编程语言中,包括Python。

正则表达式的基础语法

正则表达式由许多元字符和符号组成,这些字符和符号具有特定的含义。以下是一些常见的正则表达式元字符及其作用:

1、普通字符

匹配自身。例如,正则表达式abc匹配字符串中的abc

2、点号(.)

匹配除换行符外的任意单个字符。例如,正则表达式a.b可以匹配aabacb等,但不能匹配a\nb

3、星号(*)

匹配前面的字符零次或多次。例如,正则表达式ab*c可以匹配acabcabbc等。

4、加号(+)

匹配前面的字符一次或多次。例如,正则表达式ab+c可以匹配abcabbc等,但不能匹配ac

5、问号(?)

匹配前面的字符零次或一次。例如,正则表达式ab?c可以匹配acabc

6、方括号([])

匹配方括号内的任意一个字符。例如,正则表达式[abc]可以匹配abc

7、脱字符(^)

匹配字符串的开始位置。例如,正则表达式^abc匹配以abc开头的字符串。

8、美元符号($)

匹配字符串的结束位置。例如,正则表达式abc$匹配以abc结尾的字符串。

9、竖线(|)

表示逻辑或。例如,正则表达式a|b可以匹配ab

10、圆括号(())

用于分组和提取子模式。例如,正则表达式(abc)可以匹配并提取abc

11、反斜杠(\)

转义字符,用于匹配元字符的字面值。例如,正则表达式\.匹配点号本身,而不是任意字符。

正则表达式的高级特性

字符类

字符类是一种简化匹配特定字符集合的方法。方括号内的字符集合构成一个字符类。常见的字符类包括:

  • [a-z]:匹配任何小写字母。
  • [A-Z]:匹配任何大写字母。
  • [0-9]:匹配任何数字。
  • [a-zA-Z0-9]:匹配任何字母或数字。
  • [^a-z]:匹配除小写字母以外的任何字符。

预定义字符类

Python的正则表达式模块re中还定义了一些常用的预定义字符类,例如:

  • \d:匹配任何数字,相当于[0-9]
  • \D:匹配任何非数字字符,相当于[^0-9]
  • \w:匹配任何字母、数字或下划线字符,相当于[a-zA-Z0-9_]
  • \W:匹配任何非字母、数字或下划线字符,相当于[^a-zA-Z0-9_]
  • \s:匹配任何空白字符(包括空格、制表符、换页符等),相当于[ \t\n\r\f\v]
  • \S:匹配任何非空白字符,相当于[^ \t\n\r\f\v]

边界匹配

正则表达式还提供了一些边界匹配符,用于匹配单词的边界或字符串的开始和结束:

  • \b:匹配单词边界。例如,正则表达式\bword\b匹配整个单词word,而不是wordysword
  • \B:匹配非单词边界。例如,正则表达式\Bword\B匹配awordb中的word部分。

贪婪与懒惰匹配

正则表达式中的量词(如*+?)默认是贪婪的,会尽可能多地匹配字符。可以通过在量词后面加?来将其变为懒惰匹配,即尽可能少地匹配字符。例如:

  • 贪婪匹配:<.*>会匹配整个字符串中的第一个<和最后一个>之间的所有字符。
  • 懒惰匹配:<.*?>会匹配第一个<和第一个>之间的字符。

Python中的正则表达式

Python提供了一个强大的正则表达式模块re,用于执行正则表达式操作。以下是一些常用的re模块方法:

1、re.match()

  • 用于从字符串的起始位置匹配正则表达式。如果匹配成功,返回一个匹配对象,否则返回None
import repattern = r'hello'
text = 'hello world'
match = re.match(pattern, text)
if match:print(f"Match found: {match.group()}")
else:print("No match")

2、re.search()

  • 扫描整个字符串并返回第一个成功的匹配。
pattern = r'world'
text = 'hello world'
search = re.search(pattern, text)
if search:print(f"Search found: {search.group()}")
else:print("No match")

3、re.findall()

  • 查找字符串中所有非重叠的匹配项,并以列表的形式返回。
pattern = r'\d+'
text = 'There are 123 apples and 456 oranges'
matches = re.findall(pattern, text)
print(matches)  # Output: ['123', '456']

4、re.finditer()

  • findall类似,但返回的是一个迭代器,每个匹配项都是一个MatchObject
pattern = r'\d+'
text = 'There are 123 apples and 456 oranges'
matches = re.finditer(pattern, text)
for match in matches:print(match.group())

5、re.sub()

  • 替换字符串中所有匹配的子串,并返回替换后的字符串。
pattern = r'apples'
replacement = 'bananas'
text = 'I have apples and apples'
new_text = re.sub(pattern, replacement, text)
print(new_text)  # Output: 'I have bananas and bananas'

6、re.split()

  • 根据匹配的子串将字符串分割成列表。
pattern = r'\s+'
text = 'I have apples and oranges'
result = re.split(pattern, text)
print(result)  # Output: ['I', 'have', 'apples', 'and', 'oranges']

MatchObject对象

当正则表达式匹配成功时,re.match()re.search()等方法会返回一个MatchObject对象。这个对象包含匹配的相关信息,可以通过以下方法访问:

  • group():返回匹配的子串。
  • start():返回匹配的起始位置。
  • end():返回匹配的结束位置。
  • span():返回匹配的起始和结束位置。
import repattern = r'world'
text = 'hello world'
match = re.search(pattern, text)
if match:print(f"Matched text: {match.group()}")  # Output: worldprint(f"Start position: {match.start()}")  # Output: 6print(f"End position: {match.end()}")  # Output: 11print(f"Span: {match.span()}")  # Output: (6, 11)

编译正则表达式

对于需要多次使用的正则表达式,可以使用re.compile()将其编译成正则表达式对象,提高匹配效率。

import repattern = re.compile(r'\d+')
text = 'There are 123 apples and 456 oranges'
matches = pattern.findall(text)
print(matches)  # Output: ['123', '456']

实例与应用

验证邮箱地址

import redef validate_email(email):pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'return re.match(pattern, email) is not Noneemail = 'example@example.com'
print(validate_email(email))  # Output: True

提取URL中的域名

import redef extract_domain(url):pattern = r'https?://(www\.)?([^/]+)'match = re.search(pattern, url)if match:return match.group(2)return Noneurl = 'https://www.example.com/path/to/page'
print(extract_domain(url))  # Output: example.com

替换文本中的敏感词

import redef censor_text(text, sensitive_words):pattern = '|'.join(map(re.escape, sensitive_words))return re.sub(pattern, '****', text)text = 'This is a bad and ugly example.'
sensitive_words = ['bad', 'ugly']
print(censor_text(text, sensitive_words))  # Output: This is a **** and **** example.

解析复杂文本格式

import relog_entry = '2024-07-18 12:34:56 ERROR [main] - A critical error occurred'
pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\w+) \[(\w+)\] - (.*)'
match = re.match(pattern, log_entry)
if match:timestamp, log_level, source, message = match.groups()print(f"Timestamp: {timestamp}")print(f"Log Level: {log_level}")print(f"Source: {source}")print(f"Message: {message}")

正则表达式是一种强大且灵活的文本处理工具,通过掌握其基础语法和高级特性,可以高效地解决各种复杂的文本匹配和处理问题。在Python中,利用re模块可以方便地使用正则表达式进行字符串操作。无论是数据验证、文本搜索与替换,还是解析复杂的文本格式,正则表达式都提供了极大的便利。

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

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

相关文章

Spring MVC-什么是Spring MVC?

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 1.MVC定义2. Spring MVC 官方对于Spring Web MVC的描述这样的: Spring Web MVC is the original web framework built on the Servlet APl and has been includedin the Spring Frame…

node解析Excel中的考试题并实现在线做题功能

1、背景 最近公司安排业务技能考试&#xff0c;下发excel文件的题库&#xff0c;在excel里查看并不是很方便&#xff0c;就想着像学习驾考题目一样&#xff0c;一边看一边做&#xff0c;做完之后可以查看正确答案。 2、开始分析需求 题目格式如下图 需求比较简单&#xff0c;…

【二叉树】【动态规划】1、斐波那契数+2、零钱兑换

1、遍历&#xff1a;在遍历的过程中就能够解决问题&#xff0c;只需要递归函数的参数即可。 2、子树&#xff1a;只有在遍历完成之后才能解决问题&#xff0c;还需要递归函数的返回值。&#xff08;需要在后序位置写代码&#xff09; 动态规划&#xff1a;子树 核心思想是穷举…

【electron】 快速启动electron 应用

学无止境&#xff1a; 最近在搞electron项目&#xff0c;最重要的是总结 &#xff0c;写下来总不会忘记&#xff0c;也希望给大家参考一下&#xff0c;有不对的地方希望大家多指点。 快速启动electron 应用 1 克隆示例项目的仓库 git clone https://github.com/electron/ele…

Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBase 正在 章节内容 上一节我们完成了&#xff1a; 集群的…

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…

java文本比较解决方案

参考资料 VBA计算页码和行号https://learn.microsoft.com/zh-cn/office/vba/api/word.wdinformation 概述&#xff1a; 最近在做word文档对比的&#xff0c;总结了几种解决方案&#xff0c;记录一下 在java中&#xff0c;常用的文本对比方案有如下几种&#xff1a; 差异比较…

Linux网络——套接字与UdpServer

目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…

rabbitmq生产与消费

一、rabbitmq发送消息 一、简单模式 概述 一个生产者一个消费者模型 代码 //没有交换机&#xff0c;两个参数为routingKey和消息内容 rabbitTemplate.convertAndSend("test1_Queue","haha");二、工作队列模式 概述 一个生产者&#xff0c;多个消费者&a…

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件&#xff0c;但是&#xff0c;当我们想要对其进行编辑的时候&#xff0c;PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗&#xff1f;如何将PDF转换成可以直接编辑的CAD图纸呢&#xff1f;本篇给你答案。 1、启动迅捷CAD编辑器&…

【python学习】爬虫中常使用的urllib和requests库的的背景、定义、特点、功能、代码示例以及两者的区别

引言 urllib是Python标准库中的一个模块&#xff0c;它提供了一系列用于操作URL的功能 requests是一个Python第三方库&#xff0c;由Kenneth Reitz创建&#xff0c;用于简化HTTP客户端的编程 一、urllib的定义 urllib可以操作url&#xff0c;主要分为以下几个子模块&#xff1…

从人工巡检到智能防控:智慧油气田安全生产的新视角

一、背景需求 随着科技的飞速发展&#xff0c;视频监控技术已成为各行各业保障安全生产、提升管理效率的重要手段。特别是在油气田这一特殊领域&#xff0c;由于其工作环境复杂、安全风险高&#xff0c;传统的监控方式已难以满足实际需求。因此&#xff0c;基于视频监控AI智能…

ROS2从入门到精通2-3:机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo&#xff1f;2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量 3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图 5 常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底…

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效 上篇作业解题 在前一篇文章的最后,给各位看官留了一个作业,如上图所示。本篇文章,我们来公布一下它的源码。 主要实现的思路 四个渐变色的线段,沿着四个方向的依次运动,(运动在加载前执行)使用 …

均值滤波算法及实现

均值滤波器的使用场景&#xff1a; 均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景 红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区&#xff08;也即延时周期&#xff09;&#xff0c;使得测量值经过缓冲不会出现特别大的变化。 黄色曲线为高斯噪声…

【iOS】—— 消息传递和消息转发

【iOS】—— 消息传递和消息转发 1. 消息传递SEL选择子IMP快速查找汇编代码查找过程总结消息转送快速查找IMP 慢速查找总结消息传递慢速查找IMP 2. 消息转发动态决议动态解析添加方法 快速转发慢速转发 总结动态决议消息转发消息的三次拯救 1. 消息传递 在iOS中&#xff0c;消…

一、单例模式

文章目录 1 基本介绍2 实现方式2.1 饿汉式2.1.1 代码2.1.2 特性 2.2 懒汉式 ( 线程不安全 )2.2.1 代码2.2.2 特性 2.3 懒汉式 ( 线程安全 )2.3.1 代码2.3.2 特性 2.4 双重检查2.4.1 代码2.4.2 特性 2.5 静态内部类2.5.1 代码2.5.2 特性 2.6 枚举2.6.1 代码2.6.2 特性 3 实现的要…

谷粒商城-全文检索-ElasticSearch

1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…

基于X86+FPGA+AI数字化医疗设备:全自动尿沉渣检测仪

助力数字医疗发展&#xff0c;信迈可提供全自动尿沉渣检测仪专用计算机 随着信息技术的不断进步&#xff0c;医疗也进入了一个全新的数字化时代。首先是医疗设备的数字化&#xff0c;大大丰富了医疗信息的内涵和容量&#xff0c;具有广阔的市场发展前景。 数字化医疗设备&…

使用Redis的SETNX命令实现分布式锁

什么是分布式锁 分布式锁是一种用于在分布式系统中控制多个节点对共享资源进行访问的机制。在分布式系统中&#xff0c;由于多个节点可能同时访问和修改同一个资源&#xff0c;因此需要一种方法来确保在任意时刻只有一个节点能够对资源进行操作&#xff0c;以避免数据不一致或…