正则表达式(Regular Expression, Regex)详解

正则表达式(Regular Expression, Regex)详解

正则表达式是一种用来匹配字符串的模式,它为文本处理提供了强大的功能,可以用于查找、替换、提取特定模式的文本。正则表达式广泛应用于文本搜索、数据验证、文本替换等场景。

一、正则表达式的基本语法

正则表达式由字符、元字符和量词组成。通过它们的组合,可以构建出非常复杂的匹配规则。

1. 元字符(Metacharacters)

元字符是正则表达式中的特殊字符,用于定义某种特定的匹配模式:

元字符含义
.匹配任意单个字符(除换行符)
^匹配字符串的开头
$匹配字符串的结尾
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
?匹配前面的字符零次或一次
[]匹配括号内的任意字符(字符集)
``
()分组,括号内的内容作为一个整体匹配
\转义符,表示将元字符转换为普通字符

2. 量词(Quantifiers)

量词用于控制匹配的次数,指定某个模式出现的次数范围:

量词含义
*匹配前面的模式零次或多次
+匹配前面的模式一次或多次
?匹配前面的模式零次或一次
{n}匹配前面的模式正好 n
{n,}匹配前面的模式至少 n
{n,m}匹配前面的模式至少 n 次,至多 m

3. 字符集(Character Classes)

字符集是用来定义要匹配的字符范围或类别:

字符集含义
[abc]匹配字符 abc
[^abc]匹配除 abc 之外的任意字符
[a-z]匹配所有小写字母
[A-Z]匹配所有大写字母
[0-9]匹配所有数字
\d匹配任意数字,等价于 [0-9]
\D匹配任意非数字字符,等价于 [^0-9]
\w匹配任意字母、数字或下划线,等价于 [A-Za-z0-9_]
\W匹配任意非字母、数字或下划线字符
\s匹配任意空白字符(空格、制表符、换行符等)
\S匹配任意非空白字符

二、常见正则表达式例子

1. 匹配电子邮件地址

要匹配一个电子邮件地址,可以使用以下正则表达式:

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+

解释:

  • [a-zA-Z0-9_.+-]+:匹配邮箱名称部分,允许字母、数字、下划线、点号、加号、减号等字符,并且至少一个字符。
  • @:匹配固定的符号 @
  • [a-zA-Z0-9-]+:匹配域名部分,允许字母、数字和短横线。
  • \.:匹配点号。
  • [a-zA-Z0-9-.]+:匹配域名后缀部分,允许字母、数字、点号和短横线。

2. 匹配电话号码(中国手机号码)

匹配中国的11位手机号码(以1开头):

1[3-9]\d{9}

解释:

  • 1:匹配以 1 开头。
  • [3-9]:匹配第二位数字,范围为 39
  • \d{9}:匹配后面9位数字。

3. 匹配IP地址

IPv4 地址的匹配:

\b(?:\d{1,3}\.){3}\d{1,3}\b

解释:

  • \d{1,3}:匹配1到3位数字。
  • \.:匹配点号。
  • (?: ... ):非捕获组,匹配点号和数字部分三次。
  • \b:匹配边界,确保是独立的IP地址。

4. 匹配日期(格式:YYYY-MM-DD)

\d{4}-\d{2}-\d{2}

解释:

  • \d{4}:匹配4位数字(年份)。
  • -:匹配连字符。
  • \d{2}:匹配两位数字(月份和日期)。

5. 匹配URL地址

https?:\/\/(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9#]+/?)* 

解释:

  • https?:匹配 httphttps
  • :\/\/:匹配 ://
  • (www\.)?:可选匹配 www.
  • [a-zA-Z0-9-]+:匹配域名部分。
  • \.[a-zA-Z]{2,}:匹配域名后缀,至少两位字母。
  • (/[a-zA-Z0-9#]+/?)*:匹配路径部分,可以出现零次或多次。

三、正则表达式在Python中的使用

在Python中,正则表达式由 re 模块提供支持。我们可以使用 re 模块来执行匹配、替换、查找等操作。

1. 导入 re 模块

import re

2. 常用方法

  • re.search():搜索字符串,返回第一个匹配的对象。
  • re.match():从字符串的开头开始匹配,如果开头不匹配则返回 None
  • re.findall():返回所有匹配的字符串列表。
  • re.sub():替换匹配的字符串。
  • re.split():根据正则表达式分割字符串。

3. 实例代码

1. 匹配电子邮件地址
import re

text = "请联系: example@gmail.com 或 admin@domain.org"
email_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'

emails = re.findall(email_pattern, text)
print(emails)  # 输出: ['example@gmail.com', 'admin@domain.org']
2. 替换手机号码中的中间部分

将中国手机号的中间四位替换为****,如 13812345678 替换为 138****5678

phone = "13812345678"
masked_phone = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone)
print(masked_phone)  # 输出: 138****5678
3. 分割字符串

使用正则表达式按空格或逗号分割字符串:

text = "apple, banana orange,grape"
split_text = re.split(r'[,\s]+', text)
print(split_text)  # 输出: ['apple', 'banana', 'orange', 'grape']
4. 验证日期格式

验证日期是否符合 YYYY-MM-DD 格式:

date_pattern = r'^\d{4}-\d{2}-\d{2}$'
date = "2024-10-22"

if re.match(date_pattern, date):
    print("日期格式正确")
else:
    print("日期格式错误")

四、贪婪与非贪婪匹配

  • 贪婪匹配:正则表达式默认是贪婪的,会尽可能多地匹配字符。
  • 非贪婪匹配:通过在量词后加 ?,让正则表达式匹配尽可能少的字符。

例子

text = "<html><head><title>Title</title></head><body>Content</body></html>"

# 贪婪匹配,会匹配到从第一个 < 到最后一个 >
print(re.findall(r'<.*>', text))  
# 输出: ['<html><head><title>Title</title></head><body>Content</body></html>']

# 非贪婪匹配,匹配最短的 < 和 > 之间的内容
print(re.findall(r'<.*?>', text)) 
# 输出: ['<html>', '<head>', '<title>', '</title>', '</head>', '<body>', '</body>', '</html>']

五、总结

正则表达式是一个非常强大的工具,适用于各种文本处理任务。从基础的匹配字符到复杂的模式提取,正则表达式提供了灵活的解决方案。尽管刚开始学习可能会显得复杂,但随着使用经验的积累,它将成为处理文本和数据不可或缺的工具。

下一步建议

  1. 通过更多实际案例练习正则表达式的应用,如日志分析、表单验证等。
  2. 学习如何在不同的编程语言中使用正则表达式,因为许多语言都支持正则表达式,如JavaScript、Java、Perl等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式实时操作系统开发】智能家居入门4(FreeRTOS、MQTT服务器、MQTT协议、STM32、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…

1 -《本地部署开源大模型》如何选择合适的硬件配置

如何选择合适的硬件配置 为了在本地有效部署和使用开源大模型&#xff0c;深入理解硬件与软件的需求至关重要。在硬件需求方面&#xff0c;关键是配置一台或多台高性能的个人计算机系统或租用配备了先进GPU的在线服务器&#xff0c;确保有足够的内存和存储空间来处理大数据和复…

Linux杀毒-KVRT

&#x1f680;目录 (一) 简介&#x1f680;(二) 下载地址&#x1f61f;方式一&#xff1a;访问官网下载方式二&#xff1a;wget下载 (三) 使用方式1.修改执行权限2.命令行下进行扫描动作全盘扫描扫描指定目录 可视化界面下进行扫描动作 &#xff08;四&#xff09;更多操作&…

使用Python抓取房源信息

1. 引言 在当今大数据时代&#xff0c;网络爬虫成为获取信息的重要手段之一。本文将以某家二手房为例&#xff0c;演示如何使用Python爬虫抓取房源信息&#xff0c;并将这些信息保存到Excel文件中。 目标网站 2. 准备工作 2.1 安装必要的库 在开始之前&#xff0c;请确保你…

QT日志库:log4Qt及Qt自带日志库使用

介绍 Log4Qt是使用Trolltech Qt Framework的Apache Software Foundation Log4j包的C 端口。它旨在供开源和商业Qt项目使用。所以 Log4Qt 是Apache Log4J 的Qt移植版&#xff0c;所以看Log4J的资料应该是最直接有效的(因为 Log4Qt的直接资料太少了)。 Log4Qt主要是用来记录日志(…

DCS项目调试踩坑记录

最近在调试一个DCS项目&#xff08;集散控制系统&#xff09;&#xff0c;实际上就是一个新建厂区的控制系统。PLC用的是西门子1500&#xff0c;控制画面使用组态王7.5。 在调试过程中&#xff0c;发现给西门子DB块的变量转移到组态王太难了&#xff0c;因此记录一下&#xff0…

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09;定于2024年12月27-29日在中国厦门举行。会议旨在为从事“人工智能、机器人和通信”研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xff0c;了解学术发展趋势&#xf…

TCRT5000红外循迹传感器指南

开始先发送红外线 当返回的红外线的信号量小于规定值时&#xff0c;D0输出0&#xff0c;反之输出1 黑色的物体吸收红外光比其他物体多&#xff0c;所以检测到黑色物体D0会输出0,可以以此来循迹 逆时针调节电位器可以使得规定值上升&#xff0c;需要接受更多信号才能输出1 顺…

【前端】如何制作一个自己的网页(15)

有关后代选择器的具体解释&#xff1a; 后代选择器 后代选择器使用时&#xff0c;需要以空格将多个选择器间隔开。 比如&#xff0c;这里p span&#xff0c;表示只设置p元素内&#xff0c;span元素的样式。 <style> /* 使用后代选择器设置样式 */ p span { …

大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

数字后端零基础入门系列 | Innovus零基础LAB学习Day4

Module 10 利用Global Router来分析设计是否可绕通 LAB10-1 跑一个placement 本章节目的是load进一个floorplan&#xff0c;跑通一个placement并完成post-placement的timing优化 导入设计和floorplan 这步之前的lab已经做过了&#xff0c;大家再按照下面的步骤再练习巩固下…

信息安全工程师(62)网络蠕虫分析与防护

网络蠕虫分析 网络蠕虫是一种智能化、自动化&#xff0c;综合了网络攻击、密码学和计算机病毒技术的恶意程序或代码&#xff0c;它无须计算机使用者干预即可运行。这种蠕虫能够扫描和攻击网络上存在系统漏洞的节点主机&#xff0c;并通过局域网或国际互联网从一个节点传播到另一…

【UE5】通过程序化网格体组件实现剖切功能

效果 步骤 1. 新建两个Actor类蓝图&#xff0c;分别命名为“BP_CutActor”、“BP_CutPlane”&#xff0c;分别表示被剖切的网格体和剖切的片面。 2. 打开“BP_CutActor”&#xff08;被剖切的网格体&#xff09;&#xff0c;添加静态网格体组件、程序化网格体组件&#xff0c;…

(三)第一个Qt程序“Qt版本的HelloWorld”

一、随记 我们在学习编程语言的时候&#xff0c;各种讲解编程语言的书籍中通常都会以一个非常经典的“HelloWorld”程序展开详细讲解。程序虽然简短&#xff0c;但是“麻雀虽小&#xff0c;五脏俱全”&#xff0c;但是却非常适合用来熟悉程序结构、规范&#xff0c;快速形成对编…

原型模式和建造模式的区别

原型模式&#xff08;Prototype Pattern&#xff09;和建造者模式&#xff08;Builder Pattern&#xff09;虽然都是创建型设计模式&#xff0c;但它们的应用场景和实现方式有着显著的区别。以下是二者的详细对比&#xff1a; 1. 意图和应用场景 原型模式&#xff1a; 意图&a…

【论文阅读】2022 TChecker Precise Static Inter-Procedural Analysis for Detecting

总览 “TChecker: Precise Static Inter - Procedural Analysis for Detecting Taint - Style Vulnerabilities in PHP Applications” 由香港中文大学的 Changhua Luo、Penghui Li 和 Wei Meng 撰写。论文介绍了 TChecker 工具&#xff0c;用于检测 PHP 应用中的污点式漏洞&am…

【Linux】为什么环境变量具有全局性?共享?写时拷贝优化?

环境变量表具有全局性的原因&#xff1a; 环境变量表之所以具有全局性的特征&#xff0c;主要是因为它们是在进程上下文中维护的&#xff0c;并且在大多数操作系统中&#xff0c;当一个进程创建另一个进程&#xff08;即父进程创建子进程&#xff09;时&#xff0c;子进程会继承…

动态路由:RIP实验

1.划分IP 2.配置环回 3.接口配置IP地址 4.进入RIP中&#xff0c;关闭手工汇总&#xff0c;选择版本号&#xff0c;宣告 5.ping命令查看是否全网通 6.在R3上配置缺省路由 [R3-rip-1]default-route originate 在边界路由器上下发缺省 7.为了安全配置手工认证 [R1-Gigab…

qt QVariant详解

QVariant是Qt框架中一个功能强大的变体类&#xff0c;它提供了一种通用的方式来存储Qt对象及其他类的值&#xff0c;能够以类似于指针的方式存储任意类型的值。 一、 主要特性 通用性&#xff1a;QVariant可以存储几乎所有数据类型&#xff0c;包括基本数据类型&#xff08;如…

刷题小记9:回溯

回溯算法模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理…