Python正则表达式:从基础到高级应用的全面总结与实战【第103篇—JSON模块】

Python正则表达式:从基础到高级应用的全面总结与实战

正则表达式是一种强大的文本匹配和处理工具,广泛应用于文本处理、数据抽取、表单验证等领域。本文将从正则表达式的基础知识出发,逐步深入,最终结合代码实战,带你全面了解正则表达式的奥妙。

在这里插入图片描述

正则表达式基础

1. 什么是正则表达式?

正则表达式是一种描述字符串匹配规则的文本模式,可以用来检索、替换、验证等操作。它由一系列字符和操作符组成,表示一种匹配规则。

2. 基础语法

  • 字符匹配: 使用普通字符直接匹配文本,如 abc 匹配字符串中的 “abc”。
  • 元字符: 具有特殊意义的字符,如 . 表示匹配任意字符,^ 表示匹配字符串的开头。
  • 字符类: 用方括号表示,如 [aeiou] 匹配任何一个元音字母。

3. 量词和边界

  • 量词: 用于指定匹配的次数,如 * 表示零次或多次,+ 表示一次或多次,? 表示零次或一次。
  • 边界: 使用 ^ 表示字符串的开头,$ 表示字符串的结尾。

正则表达式代码实战

1. 使用正则表达式验证邮箱

import redef validate_email(email):pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'if re.match(pattern, email):print(f"{email} 是一个有效的邮箱地址")else:print(f"{email} 不是一个有效的邮箱地址")# 测试
validate_email("user@example.com")
validate_email("invalid_email@.com")

2. 提取HTML中的链接

import rehtml_content = '<a href="https://www.example.com">Visit our website</a>'# 提取链接
links = re.findall(r'href="([^"]*)"', html_content)# 输出链接
for link in links:print(f"链接: {link}")

3. 替换文本中的日期格式

import retext = "今天是2024年2月27日,明天是2024-02-28。"# 替换日期格式
formatted_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)print(f"替换前: {text}")
print(f"替换后: {formatted_text}")

4. 使用正则表达式判断密码强度

import redef check_password_strength(password):# 至少8个字符,包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'if re.match(pattern, password):print("密码强度符合要求")else:print("密码强度不够")# 测试
check_password_strength("StrongPass123!")
check_password_strength("weakpassword")

5. 从文本中提取手机号码

import retext = "请联系客户:+86 13812345678 或者发送邮件至info@example.com"# 提取手机号码
phone_numbers = re.findall(r'(?:(?:\+|00)86)?1[345789]\d{9}', text)# 输出手机号码
for number in phone_numbers:print(f"手机号码: {number}")

6. 拆分逗号分隔的字符串

import recsv_data = "apple,orange,banana,grape"# 使用正则表达式拆分
items = re.split(r',', csv_data)# 输出拆分结果
print("拆分后的结果:", items)

7. 使用正则表达式验证URL

import redef validate_url(url):# 简单的URL验证,以http或https开头,后面跟着域名pattern = r'^(https?://)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:/[^/#?]+)*(?:\?[^#]*)?(?:#(.*))?$'if re.match(pattern, url):print(f"{url} 是一个有效的URL")else:print(f"{url} 不是一个有效的URL")# 测试
validate_url("https://www.example.com")
validate_url("ftp://invalid-url.com")

8. 从HTML中提取文本内容

import rehtml_content = '<p>This is a <b>sample</b> HTML content.</p>'# 提取纯文本内容
text_content = re.sub(r'<[^>]+>', '', html_content)print(f"HTML内容: {html_content}")
print(f"提取后的文本内容: {text_content}")

9. 匹配重复字符

import retext = "这个单词是重复重复的,但是它们都是有意义的重复。"# 匹配连续重复的单词
repeated_words = re.findall(r'\b(\w+)\s+\1\b', text)# 输出匹配结果
print("连续重复的单词:", repeated_words)

10. 使用正则表达式提取日志信息

import relog_data = """
2024-02-27 10:15: Error in module A
2024-02-27 11:30: Warning in module B
2024-02-27 12:45: Info: Application started
"""# 提取日志信息
log_entries = re.findall(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Error|Warning|Info): (.+)', log_data)# 输出提取结果
for entry in log_entries:timestamp, log_level, message = entryprint(f"{timestamp} - [{log_level}] {message}")

11. 使用正则表达式进行文本替换

import retext = "这是一个示例文本,包含一些需要替换的词汇,例如apple和orange。"# 替换文本中的水果名称
replaced_text = re.sub(r'\b(apple|orange)\b', 'fruit', text)print(f"替换前: {text}")
print(f"替换后: {replaced_text}")

12. 匹配多行文本

import remultiline_text = """
This is line 1.
Another line here.
And a third line.
"""# 匹配包含"line"的行
matching_lines = re.findall(r'.*line.*', multiline_text, re.MULTILINE)# 输出匹配结果
for line in matching_lines:print(f"匹配的行: {line}")

我们深入了解了正则表达式在处理日志、进行文本替换等实际场景中的应用。正则表达式的强大之处在于它的灵活性和通用性,可以适应各种文本处理需求。希望这些例子能够进一步拓展你对正则表达式的认识,并激发你在实际项目中更广泛地应用它的兴趣。如果有其他关于正则表达式的问题或者需要更多的实例,欢迎继续提问。

13. 正则表达式分组与捕获

在正则表达式中,使用括号可以创建分组,通过分组可以实现更精细的匹配和捕获。

import retext = "2024-02-27 08:30: Process A started, Process B started"# 匹配并捕获时间和进程名称
pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Process [A-Z]) started'
matches = re.findall(pattern, text)# 输出捕获结果
for match in matches:timestamp, process_name = matchprint(f"时间: {timestamp}, 进程: {process_name}")

14. 非贪婪匹配

正则表达式默认是贪婪匹配,即尽可能匹配更多的字符。在量词后加上?可以实现非贪婪匹配。

import retext = "<b>bold text</b> and <i>italic text</i>"# 贪婪匹配
greedy_match = re.search(r'<.*>', text).group()# 非贪婪匹配
non_greedy_match = re.search(r'<.*?>', text).group()print(f"贪婪匹配: {greedy_match}")
print(f"非贪婪匹配: {non_greedy_match}")

15. 使用正则表达式验证IP地址

import redef validate_ip_address(ip):pattern = r'^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)){3}$'if re.match(pattern, ip):print(f"{ip} 是一个有效的IP地址")else:print(f"{ip} 不是一个有效的IP地址")# 测试
validate_ip_address("192.168.0.1")
validate_ip_address("256.0.0.1")

通过这些高级的正则表达式实例,我们进一步提升了对正则表达式功能的理解和应用。分组、非贪婪匹配等特性使得正则表达式更加灵活和强大,能够满足更复杂的匹配需求。希望这些例子有助于你更深入地理解和运用正则表达式。如果你还有其他关于正则表达式的问题,欢迎提出。

16. 零宽断言

零宽断言是一种特殊的正则表达式结构,用于在匹配位置上添加条件,但并不消耗字符。常见的零宽断言包括正向先行断言((?=...))、负向先行断言((?!...))、正向后行断言((?<=...))、负向后行断言((?<!...))等。

import retext = "apple orange banana"# 匹配单词前面是"apple"的空格
positive_lookahead = re.search(r'apple(?=\s)', text).group()# 匹配单词前面不是"apple"的空格
negative_lookahead = re.search(r'(?<!apple)\s', text).group()print(f"正向先行断言: {positive_lookahead}")
print(f"负向先行断言: {negative_lookahead}")

17. 使用正则表达式验证日期格式

import redef validate_date(date):pattern = r'^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$'if re.match(pattern, date):print(f"{date} 是一个有效的日期格式")else:print(f"{date} 不是一个有效的日期格式")# 测试
validate_date("2024-02-27")
validate_date("2024/02/27")

18. 正则表达式的替换与回调函数

利用正则表达式进行替换时,可以结合回调函数,实现更复杂的替换逻辑。

import redef multiply(match):number = int(match.group(1))return str(number * 2)text = "Numbers: 2, 5, 8, 12"# 使用回调函数替换数字
result = re.sub(r'\b(\d+)\b', multiply, text)print(f"替换前: {text}")
print(f"替换后: {result}")

通过这些高级的正则表达式实例,我们深入了解了零宽断言、日期格式验证以及替换与回调函数的应用。这些功能强大的特性使得正则表达式成为处理复杂文本匹配和替换任务的得力工具。希望这些例子有助于你更灵活地运用正则表达式解决实际问题。如果你还有其他关于正则表达式的疑问或需求,欢迎继续提问。

总结:

通过本文的内容,我们全面深入地探讨了正则表达式的基础知识和高级应用。在基础部分,我们学习了正则表达式的基本概念、语法元素以及常见的匹配规则。随后,我们通过多个实例展示了正则表达式在不同场景的代码应用,包括邮箱验证、HTML链接提取、文本替换、密码强度验证等。

在高级部分,我们介绍了正则表达式的进阶特性,包括分组与捕获、非贪婪匹配、零宽断言等。这些特性使得正则表达式更加灵活,能够应对更复杂的文本匹配需求。同时,我们还探讨了如何使用正则表达式验证日期格式、IP地址,以及利用回调函数实现更复杂的替换逻辑。

通过这篇文章,读者不仅学到了正则表达式的基础知识,还深入了解了它在实际编程中的广泛应用。正则表达式作为文本处理的得力工具,能够提高开发效率,简化代码逻辑。希望本文的内容能够帮助读者更自信、更灵活地运用正则表达式解决实际问题,同时也鼓励进一步深入学习和探索这一强大工具。如有任何问题或疑问,欢迎随时提问,共同学习进步。

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

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

相关文章

赵文彬将出席无磷锅炉工艺助剂在锅炉水节水节能应用

演讲嘉宾&#xff1a;赵文彬 集团副总/技术总监 上远未来水务集团有限公司 演讲题目&#xff1a;无磷锅炉工艺助剂在锅炉水节水节能方面的应用 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&a…

mac 安装hbuilderx

下载 HBuilderX下载地址: 下载地址 选额mac版本点击下载 安装 如图&#xff0c;将HBuilderX拖到Applications&#xff0c;才是正确的安装姿势。 MacOSX&#xff0c;软件必须安装到/Applications目录&#xff0c;如未安装到此目录&#xff0c;可能会出现插件安装失败、项目创建…

Linux中的动静态库

目录 一、静态库 &#xff08;1&#xff09;静态库的优缺点&#xff1a; &#xff08;2&#xff09;Linux下静态库的创建和执行 1.直接编译​编辑 2.指定路径和库名 3.用LIBRARY_PATH环境变量来配置路径 二、动态库 &#xff08;1&#xff09;动态库的优缺点 &#xff…

javaweb请求与响应

前言 前面介绍了对应的服务器端的相关代码。这里开始学习服务器端与客户端的数据请求与响应 这里的仅仅是一个简单的调用&#xff0c;并没有经过servelert接口来进行调用&#xff0c;同前面的一样&#xff0c;我们介绍对应的本地服务器进行的部署项目。 代码 //属于简单的不…

Scratch 第十三课-飞机大战游戏

第十三课-飞机大战游戏 学习目标 这节课我们做一款大家都爱玩的飞机大战游戏&#xff0c;学习重点&#xff1a; 如何导入外部角色如何让飞机发射子弹鼠标控制角色移动 程序设计 程序分析 &#xff1a; 飞机大战游戏相信很多小朋友都玩过&#xff0c;我方飞机在下方&#xf…

LabVIEW石油钻机提升系统数字孪生技术

LabVIEW石油钻机提升系统数字孪生技术 随着数字化、信息化、智能化的发展&#xff0c;石油钻采过程中的石油钻机数字化技术提升成为了提高钻井效率、降低生产成本的重要途径。基于中石油云平台提供的数据&#xff0c;采用数字孪生技术&#xff0c;对石油钻机提升系统进行数字化…

[Redis]——初识Redis

一、Redis为非关系型数据库 ❓我们常见的MySQL、SQLServer都是关系型数据库&#xff0c;那他们之间有什么区别与联系呢&#xff1f; &#x1f4d5;关系型数据库与非关系型数据库的区别&#xff08;面试题&#xff09; 解释&#xff1a; SQL数据库中的表是有结构的&#xff0c;包…

腾讯云学生云服务器_学生云主机_学生云数据库_云+校园特惠套餐

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

小程序和页面生命周期详解

目录 小程序的生命周期 创建&#xff08;onLoad&#xff09;&#xff1a; 显示&#xff08;onShow&#xff09;&#xff1a; 隐藏&#xff08;onHide&#xff09;&#xff1a; 卸载&#xff08;onUnload&#xff09;&#xff1a; 错误监听&#xff08;onError&#xff09;…

JVM 第二部分-2(堆,方法区)

4.堆 堆 一个Java程序&#xff08;main方法&#xff09;对应一个jvm实例&#xff0c;一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建&#xff0c;大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域&#xff0c;是垃圾回收的重点区域堆可以位…

洛谷P1509找啊找啊找GF

题解&#xff1a;这题我们需要考虑两个因素 &#xff0c;既要有钱&#xff0c;也需要有人品&#xff0c;但是呢&#xff0c;还想花最少得时间泡到最多的女生&#xff0c;那么这题我们就要用到以往的二维dp数组&#xff0c;但是真的是二维的吗&#xff1f;不&#xff0c;因为要考…

如何让大项目自动化测试更加灵活简洁

如何把大象放到冰箱里&#xff1f;第一打开冰箱门&#xff0c;第二把大象放进去&#xff0c;第三把冰箱门关好。 这个问题言外之意是大象那么大&#xff0c;怎么能放进冰箱&#xff0c;为什么要把大象放冰箱&#xff0c;就开始纠结这个问题了&#xff0c;它是想表明不用太多纠结…

Day20-磁盘管理

Day20-磁盘管理 1. cut 切:2. 磁盘历史和内外部物理结构介绍2.1 磁盘发展趋势和实现措施2.2 磁盘知识的体系结构2.3 机械磁盘的外部结构2.4 SSD固态硬盘的外部结构2.5 固态硬盘内部结构2.6 缓存在服务器各硬件上的速度和大小对比另类维度图解&#xff0c;从上到下由高速到低速&…

DataX及Datax-web杂记

&#x1f47d;个人博客&#xff1a;https://everspring.github.io/ &#x1f47d;公众号&#xff1a;爱历史的IT男 一. DataX调试 DataX之前调试不是很方便&#xff0c;要打包后才能调试。23年7月后一位叫"FuYouJ "的开源者提交了datax-example模块&#xff0c;就方…

EasyRecovery2024国产免费的手机数据恢复软件

一、功能介绍 EasyRecovery手机数据恢复软件是一款功能全面的数据恢复工具&#xff0c;专为移动设备设计。其主要功能包括&#xff1a; 文件恢复&#xff1a;能够恢复手机中因各种原因丢失的文件&#xff0c;如照片、视频、音频、文档等。深度扫描&#xff1a;通过深度扫描手…

【数据结构】实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解栈&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一 .栈的概念及结构二 .栈的实现栈的结构体初始化销毁栈顶插入栈顶删除显示栈顶元素是否为空栈的大…

USB - Linux Kernel Menuconfig

Linux kernel&#xff0c;make menuconfig&#xff0c;和USB相关的&#xff0c;在主菜单选择Device Drivers。 Device Drivers下面&#xff0c;找到USB support。 在USB support下面&#xff0c;就可以对USB相关的item进行设置。 按照从上到下的顺序&#xff0c;打开的设置依次…

【C++入门】缺省参数 | 函数重载

目录 4.缺省参数 4.1缺省参数的概念 4.2缺省参数分类 4.3声明和定义分离&#xff08;声明使用缺省参数&#xff09; 4.&#x1f40d;声明和定义分离到链接 5.函数重载 5.1函数重载的概念 5.2可执行程序的形成步骤 5.3C支持函数重载的原理—名字修饰(name Mangling) 4.…

Linux学习之信号

目录 1.信号的概念 2.信号的产生 3.信号的保存 4.信号的捕捉 信号的其它内容&#xff1a; SIGCHLD信号 1.信号的概念 在Linux中&#xff0c;信号是一种用于进程之间通信的基本机制。它是一种异步事件通知&#xff0c;用于通知进程发生了某些事件。如下是一些常见的Linux信…

[计算机网络]--五种IO模型和select

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、五种IO…