什么是正则表达式,如何在 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://xiahunao.cn/news/3249696.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

DDei在线设计器-HTML渲染

Html渲染 HtmlViewer插件通过将一个外部DIV附着在图形控件上&#xff0c;从而改变原有图形的显示方式。允许使用者自己定义HTML通过HTML元素。本示例演示了通过Html来扩展渲染图形&#xff0c;从而获得更加丰富的图形展现。 通常情况下&#xff0c;我们创建的图形控件&#xff…

PHP基础语法(一)

一、初步语法 1、PHP代码标记&#xff1a;以 <?php 开始&#xff0c;以 ?> 结束&#xff1b; 2、PHP注释&#xff1a;行注释&#xff1a;//&#xff08;双斜杠&#xff09;或# 块注释&#xff1a;/* */ 3、PHP语句分隔符&#xff1a; 1&#xff09;在PHP中&#…

机器人及其相关工科专业课程体系

机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科&#xff0c;涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…

C++:类和对象 III(初始化列表、explicit、友元、匿名对象)

目录 初始化列表 初始化列表的特点 类型转换、explicit 隐式类型转换 explicit关键字 static成员 静态成员变量 静态成员函数 友元 友元函数 友元类 内部类 匿名对象 编译器优化 初始化列表 初始化列表就是类成员初始化的地方 函数有它声明和定义的地方&#x…

xFormers - Transformers 加速研究的工具箱

文章目录 一、关于 xFormers特点 二、安装xFormers三、Benchmarks&#xff08;可选&#xff09;测试安装 四、使用xFormers1、Transformers 关键概念2、Repo map3、主要特点4、安装故障排除 一、关于 xFormers xFormers是一个基于PyTorch的库&#xff0c;其中包含灵活的Transf…

Java_MyBatisPlus

MyBatisPlus属于是MyBatis的拓展&#xff0c;不影响原MyBatis框架下的代码运行&#xff0c;并对MyBatis框架进行拓展及优化。 使用步骤&#xff1a; 注意&#xff1a;继承BaseMapper时要填写泛型为要操作的实体类。 基本原理&#xff1a; MyBatisPlus通过扫描实体类&#xff…

adb查看网卡信息,并修改网卡mac地址

这种方法修改mac后&#xff0c;关机后会失效! 文章结尾有永久修改mac地址的方法! 1. 查看网卡的信息&#xff0c;以及mac地址&#xff0c;ip地址&#xff0c;子网掩码等 //查看所有网卡信息adb shell ifconfig//MAC地址&#xff1a; HWaddr 5e:2c:e9:58:3e:4f //IP地址&a…

安全防御拓扑2

实验拓扑&#xff1a;​​​​​​​ 要求&#xff1a; 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3、多出口环境基于带宽比例进行…

Django定时任务框架django-apscheduler的使用

1.安装库 pip install django-apscheduler 2.添加 install_app django_apscheduler 3.在app下添加一个task.py文件&#xff0c;用来实现具体的定时任务 task.pydef my_scheduled_job():print("这个任务每3秒执行一次", time.time()) 4.在app下创建一个manag…

studio编译报错java.lang.NullPointerException

安卓studio编译报错&#xff0c;这个是一个新建的项目就报错&#xff0c;原因是 implementation androidx.appcompat:appcompat:1.7.0版本太高&#xff0c;修改后版本 implementation androidx.appcompat:appcompat:1.4.0&#xff0c; 编译又报错 18 issues were found wh…

【Node.js】初识 Node.js

Node.js 概念 Node.js 是一个开源与跨平台的 JavaScript运行时环境 &#xff0c;在浏览器外运行 V8 JavaScript 引擎(Google Chrome的内核)&#xff0c;利用事件驱动、非阻塞和异步输入输出 等技术提高性能。 可以理解为 Node.js就是一个服务器端的、非阻塞式 l/O 的、事件驱…

npm install时卡在sill idealTree buildDeps卡着不动

场景&#xff1a;做导出功能的时候要用上xlsx&#xff0c;正常npm install xlsx --save 问题描述&#xff1a;npm install时卡在sill idealTree buildDeps&#xff0c;&#xff0c;卡着不动 过程&#xff1a;在网上一顿百度试过好多种方法 1、切换taobao的镜像地址 npm conf…

Android 使用FFmpeg解析RTSP流,ANativeWindow渲染 使用SurfaceView播放流程详解

文章目录 ANativeWindow 介绍ANativeWindow 的主要功能和特点ANativeWindow 的常用函数工作流程原理图通过ANativeWindow渲染RGB纯色示例 播放RTSP流工作流程图关键步骤解析自定义SurfaceView组件native 层解码渲染 效果展示注意事项 这篇文章涉及到jni层&#xff0c;以及Ffmpe…

设计分享—国外网站设计赏析

今天还是给大家分享一些国外的网站设计案例&#xff5e; 蓝蓝设计是一家专注而深入的界面设计公司&#xff0c;为期望卓越的国内外企业提供卓越的大数据可视化界面设计、B端界面设计、桌面端界面设计、APP界面设计、图标定制、用户体验设计、交互设计、UI咨询、高端网站设计、平…

来参与“向日葵杯”全国教育仿真技术大赛~

可点击进行了解&#xff1a;“向日葵杯”全国教育仿真技术大赛 (sunmooc.cn) 本次大赛共分为四个赛道&#xff1a;自主命题赛道、教育知识图谱设计赛道、FPGA硬件扑克牌对抗赛道、EasyAR元宇宙空间设计赛道。 参赛对象 &#xff1a; 具有正式学籍的在校研究生&#xff0c;本科…

Memcached介绍与使用

引言 本文是笔者对Memcached这个高性能分布式缓存组件的实践案例&#xff0c;Memcached是一种高性能的分布式内存对象缓存系统&#xff0c;用于减轻数据库负载&#xff0c;加速动态Web应用&#xff0c;提高网站访问速度。它通过在内存中缓存数据和对象来减少读取数据库的次数&…

Postman导出excel文件

0 写在前面 在我们后端写接口的时候&#xff0c;前端页面还没有出来&#xff0c;我们就得先接口测试&#xff0c;在此记录下如何使用postman测试导出excel接口。 如果不会使用接口传参可以看我这篇博客如何使用Postman 1 方法一 2 方法二 3 写在末尾 虽然在代码中写入文件名…

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…

uniapp H5 如何根据接口返回form表单,跳转银联支付界面?

uniapp如何根据form表单&#xff0c;唤醒第三方支付? 文章目录 uniapp如何根据form表单&#xff0c;唤醒第三方支付?效果图实现 效果图 接口返回 form 表单数据 实现 // 例请求成功&#xff0c;返回数据 rechargePay({}).then(res > {// 接收接口返回数据let { result …

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…