【新人系列】Python 入门(十六):正则表达式

ops/2024/12/14 13:27:05/

✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪

在线正则表达式测试:https://tool.oschina.net/regex/#

1. 正则表达式详解

介绍

正则表达式是一种用于匹配和操作文本的规则或语法:

  • 正则表达式拥有强大的文本处理能力,支持匹配、查找、替换等操作
  • 广泛的应用领域,例如编程、数据处理、文本处理等领域
  • 通用性强,跨语言跨场景

语法

在这里插入图片描述

2. 正则表达式实战

案例一

现在有这样一串字符,我需要根据需求查找出相应的字符信息。

hello world 12345 is book 123
  1. 匹配出 hello 字符串
    1. 方法一:hello
    2. 方法二:^hello
  2. 匹配出所有数字
    1. 方法:\d+
  3. 匹配出所有字符串
    1. 方法:[a-zA-Z]+

案例二

要求写一个正则表达式,用来匹配邮箱,而邮箱规则如下:

  • 结构:前缀@后缀
  • 前缀:由大小写字母、数字、下划线、中划线等构成
  • 后缀:由小写字母或数字构成,并以 .com 结尾
123@qq.com
test@email.com
xxx@123.com

匹配邮箱的正则表达式

  1. 匹配单个邮箱
    1. 方法:^[a-zA-Z0-9_-]+@[a-z0-9]+.com$
  2. 匹配多个邮箱
    1. 方法:[a-zA-Z0-9_-]+@[a-z0-9]+.com

3. Python 正则表达式用法 - re 模块

3.1 re.search( )

在字符串中搜索匹配正则表达式的第一个位置。

python">import retext = "Hello, World!"
result = re.search('World', text)# 找到匹配
if result:print("找到匹配")print(result)    # <re.Match object; span=(7, 12), match='World'>print(result.span())     # (7, 12)print(result.group())    # World
else:print("未找到匹配")

3.2 re.match( )

用于从字符串的起始位置匹配正则表达式,如果起始位置匹配成功,则返回一个匹配对象;否则返回 None。

python">import retext = "Hello World"
result = re.match('Hello', text)# 匹配成功
if result:print("匹配成功")print(result)    # <re.Match object; span=(0, 5), match='Hello'>print(result.span())     # (0, 5)print(result.group())    # Hello
else:print("匹配失败")

Tips:
re.match() 只从字符串的起始位置进行匹配,而 re.search() 则会在字符串中搜索匹配的部分,不限于起始位置。

再看个复杂点的正则表达式,进一步理解一下 match 和 search 函数的区别。

python"># !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author:gdx
# @File:test.py.py
# @Project:test_pythonimport re# 匹配1
text1 = "@#@!¥123_23134@qq.com"
result = re.match('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text1)
# 匹配失败
if result:print("匹配成功")print(result)print(result.group())
else:print("匹配失败")# 匹配2
result = re.search('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text1)
# 匹配成功
if result:print("匹配成功")print(result)  # <re.Match object; span=(5, 21), match='123_23134@qq.com'>print(result.group())  # 123_23134@qq.com
else:print("匹配失败")# 匹配3
text2 = "123_23134@qq.com"
result = re.match('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text2)
# 匹配成功
if result:print("匹配成功")print(result)    # <re.Match object; span=(0, 16), match='123_23134@qq.com'>print(result.group())    # 123_23134@qq.com
else:print("匹配失败")

3.3 re.findall( )

返回字符串中所有匹配正则表达式的子串。

python">import retext = "apple, banana, cherry"
matches = re.findall('a[a-z]+', text)   # ['apple', 'anana']
print(matches) 

3.4 re.compile( )

re.complile() 用于编译正则表达式模式,生成一个正则表达式对象。这个对象可以被多次使用,从而提高效率。它接受一个字符串形式的正则表达式作为参数,并返回一个编译后的正则表达式对象。

除了前面提到的可以直接使用编译后的对象调用 findall 等方法之外,还可以设置一些标志参数来影响正则表达式的匹配行为。

常见的标志参数有:

  • re.IGNORECASE 或 re.I :使匹配对大小写不敏感。
  • re.MULTILINE 或 re.M :多行模式,影响 ^ 和 $ 的匹配行为。
  • re.DOTALL 或 re.S :使 . 匹配包括换行符在内的所有字符。
python">import repattern = re.compile('hello', re.IGNORECASE)
text = "Hello World"
result = pattern.search(text)
if result:print("找到匹配")print(result)    # <re.Match object; span=(0, 5), match='Hello'>print(result.group())    # Hello
else:print("未找到匹配")

可以再来看一个分割字符串的例子。

python">import redata_list=['2小时10分20秒','3小时20分30秒','1小时10分5秒'
]
pattern = re.compile('小时|分|秒')
for i in data_list:res = pattern.split(i)print(res)"""['2', '10', '20', '']['3', '20', '30', '']['1', '10', '5', '']"""

3.5 ( ) 分组

使用括号 () 进行分组,可以提取匹配的子串。

python">import repattern = re.compile(r"(\d{3})-(\d{3})-(\d{4})")
text = "My phone number is 123-456-7890"
result = pattern.search(text)
if result:print(result.group(1))   # 123print(result.group(2))   # 456print(result.group(3))   # 7890

Tips:
这里的 r 表示原始字符串,避免一些字符需要额外的转义。

3.6 re.sub( )

使用 re.sub() 函数可以进行替换操作。

python">import retext = "Hello, World!"
new_text = re.sub('World', 'Python', text)
print(new_text)  # Hello, Python!

我们再结合前面的分组方法看一个更复杂点的例子,我想要将一串手机号的中间 4 个数字进行加密处理,我们

python">import re# 方法一:分两组
pattern = re.compile(r"(\d{3})\d{4}(\d{3})")
text = "我有几个手机号分别是:1361234567,1331234567,1797654321"
new_text = pattern.sub(r"\1****\2", text)
print(new_text)  # 我有几个手机号分别是:136****567,133****567,179****321# 方法二:分三组
pattern = re.compile(r"(\d{3})(\d{4})(\d{3})")
text = "我有几个手机号分别是:1361234567,1331234567,1797654321"
new_text = pattern.sub(r"\1****\3", text)
print(new_text)  # 我有几个手机号分别是:136****567,133****567,179****321

http://www.ppmy.cn/ops/141830.html

相关文章

pcl::PointCloud<pcl::PointXYZ>和pcl::PointCloud<pcl::PointXYZ>::Ptr 转换及新建点云显示

点云智能指针格式和非指针格式的转换 pcl::PointCloud<PointT>::Ptr cloud_ptr(new pcl::PointCloud<PointT>); pcl::PointCloud<PointT> cloud; cloud *cloud_ptr; cloud_ptr boost::make_shared<pcl::PointCloud<PointT>>(cloud);全部代码&…

关于前端数据Fail to load response data解决方法

0.提前说明 “Failed to load response data:” 这个错误通常是由于请求的资源没有被正确加载或者没有找到。这可能是由于以下几种原因导致的&#xff1a; 资源路径错误: 确保你请求的资源路径是正确的。检查一下你的代码&#xff0c;确保你指定的路径是准确的&#xff0c;并且…

反向代理是什么?

反向代理&#xff08;Reverse Proxy&#xff09;简介 反向代理是一种服务器端的技术&#xff0c;它位于客户端和后端服务器之间&#xff0c;作为中间层来处理客户端的请求。与传统的正向代理不同&#xff0c;反向代理的主要作用是将客户端的请求转发给一个或多个后端服务器&am…

边缘AI和智能音频专家XMOS全球首家增值经销商(VAR)落地中国

强强合作——XMOS与飞腾云达成全球首家增值经销协议以用智能音频技术和产品服务全球厂商和消费者 中国深圳&#xff0c;2024年12月——全球领先的软件定义系统级芯片&#xff08;SoC&#xff09;开发商XMOS宣布&#xff1a;公司已与飞腾云科技达成增值分销协议&#xff0c;授权…

【Spark】Spark性能调优

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…

代码随想录训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;又是构造二叉树&#xff0c;又有很多坑&#xff01;| LeetCode&#xff1a;654.最大二叉树_哔哩哔哩_bilibili 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子…

开源模型应用落地-知识巩固-生产级AI服务优化(二)

一、前言 在构建基于Flask的AI接口服务时,采用蓝图(Blueprint)架构可以大幅提升应用的可管理性和扩展性。通过将不同功能模块(如用户认证、模型处理和数据管理)组织成独立的蓝图,我们可以更加清晰地划分代码结构,使团队协作和后续维护变得更加高效。同时,借助 `python-…

TCP 为什么是 3 次握手 4 次挥手?

前言&#xff1a; TCP 的 3 次握手 4 次挥手是一个非常经典的问题&#xff0c;相信各位从事 Java 的朋友在职业生涯中没少被问到这个问题&#xff0c;本篇我们就展开分析一下 TCP 为什么是 3 次握手 4 次挥手。 TCP 协议 要搞清楚 TCP 为什么是 3 次握手 4 次挥手我们需要先…