[一招过] Python的正则表达式篇

Python 正则表达式(re模块)

正则表达式(regular expression)是用于匹配字符串的一种强大工具。Python 提供了 re 模块来处理正则表达式。通过正则表达式,可以快速匹配、查找、替换、分割字符串等。

1. re 模块基础

首先,导入 re 模块:
import re

2. 常见正则表达式语法

正则表达式使用一组特殊的符号来描述字符串的模式。以下是一些常见的正则表达式元素:

  • 元素 说明
.	匹配任何单个字符(除换行符外)
^	匹配字符串的开始位置
$	匹配字符串的结束位置
[]	字符集,匹配其中的任意字符,例如 [aeiou]
`	`
*	匹配前一个元素零次或多次
+	匹配前一个元素一次或多次
?	匹配前一个元素零次或一次
{n}	匹配前一个元素恰好 n 次
{n,}	匹配前一个元素至少 n 次
{n,m}	匹配前一个元素在 n 和 m 次之间
()	分组,用来分组正则表达式中的部分内容
\	转义字符,用来转义特殊字符,如 \.
示例正则表达式
a.b:匹配一个字符串中 a 和 b 之间有任意一个字符(除了换行符)。
^abc:匹配以 abc 开头的字符串。
abc$:匹配以 abc 结尾的字符串。
[0-9]:匹配任何一个数字字符。
[a-zA-Z]:匹配任何一个字母字符(大小写字母都匹配)。
\d:匹配任何一个数字(等价于 [0-9])。
\w:匹配任何字母、数字和下划线(等价于 [a-zA-Z0-9_])。
\s:匹配任何空白字符,包括空格、制表符、换行符等。

3. re 模块的常用函数

3.1. re.match()
re.match() 尝试从字符串的起始位置匹配一个模式,如果匹配成功,返回一个 Match 对象,否则返回 None。

import re
pattern = r"hello"
string = "hello world"
result = re.match(pattern, string)
if result:print("匹配成功")
else:print("匹配失败")

3.2. re.search()
re.search() 扫描整个字符串,返回第一个匹配的结果。如果匹配成功,返回一个 Match 对象,否则返回 None。

pattern = r"world"
string = "hello world"result = re.search(pattern, string)
if result:print(f"匹配成功: {result.group()}")
else:print("匹配失败")

3.3. re.findall()
re.findall() 返回所有匹配模式的非重叠字符串的列表。

pattern = r"\d+"  # 匹配所有数字
string = "abc 123 def 456 ghi 789"result = re.findall(pattern, string)
print(result)  # 输出 ['123', '456', '789']

3.4. re.finditer()
re.finditer() 返回一个迭代器,包含所有匹配模式的 Match 对象。可以用来获取匹配的详细信息,比如位置、分组等。

pattern = r"\d+"
string = "abc 123 def 456 ghi 789"matches = re.finditer(pattern, string)
for match in matches:print(f"匹配的字符串: {match.group()}, 开始位置: {match.start()}, 结束位置: {match.end()}")

3.5. re.sub()
re.sub() 用于替换字符串中所有匹配正则表达式的部分。

pattern = r"\d+"  # 匹配所有数字
string = "abc 123 def 456 ghi 789"result = re.sub(pattern, "数字", string)
print(result)  # 输出 abc 数字 def 数字 ghi 数字

3.6. re.split()
re.split() 根据正则表达式分割字符串,返回一个列表。

pattern = r"\s+"  # 匹配空白字符
string = "hello   world  python"result = re.split(pattern, string)
print(result)  # 输出 ['hello', 'world', 'python']
  1. 分组和捕获
    使用圆括号 () 可以对正则表达式中的一部分进行分组。捕获组可以用来提取匹配到的子字符串。
pattern = r"(\d{3})-(\d{3})-(\d{4})"  # 捕获电话号码的三部分
string = "My phone number is 123-456-7890."match = re.search(pattern, string)
if match:print("匹配成功")print(f"第一组: {match.group(1)}")  # 输出 123print(f"第二组: {match.group(2)}")  # 输出 456print(f"第三组: {match.group(3)}")  # 输出 7890
group(0):返回完整匹配的字符串。
group(n):返回第 n 个分组的匹配内容。
  1. 正则表达式中的常用符号和函数
\d:匹配数字字符,等价于 [0-9]。
\D:匹配非数字字符,等价于 [^0-9]。
\w:匹配字母、数字或下划线字符,等价于 [a-zA-Z0-9_]。
\W:匹配非字母、数字或下划线字符,等价于 [^a-zA-Z0-9_]。
\s:匹配任何空白字符(如空格、制表符、换行符等)。
\S:匹配任何非空白字符。
*:匹配前一个字符零次或多次。
+:匹配前一个字符一次或多次。
?:匹配前一个字符零次或一次。
  1. 正则表达式的模式修正符(Flags)
    正则表达式还支持一些模式修正符(flags),可以改变正则表达式的匹配行为:
re.IGNORECASE 或 re.I:忽略大小写。
re.MULTILINE 或 re.M:让 ^ 和 $ 匹配每一行的开始和结束。
re.DOTALL 或 re.S:让 . 匹配包括换行符在内的所有字符。
re.VERBOSE 或 re.X:允许正则表达式中使用空格和注释。
例如:pattern = r"^abc"  # 匹配字符串的开始
string = "abc Hello"
result = re.match(pattern, string, re.IGNORECASE)  # 忽略大小写
print(result.group())  # 输出 'abc'

总结
re 模块 是 Python 提供的处理正则表达式的标准库,允许你执行模式匹配、查找、替换等操作。
正则表达式是一种强大的工具,能够帮助你高效地处理字符串,但也需要小心使用,因为不当的正则表达式可能会影响性能或者导致复杂的错误。

面试题

1. 写正则匹配一个ip地址 10.199.65.20

要编写正则表达式来匹配类似 10.199.65.20 这样的 IPv4 地址,可以使用以下的正则模式。

r"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"

单个255 25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?
解释:

^ 和 $:分别表示字符串的开始和结束,确保匹配的是整个字符串,而不是其中的一部分。
25[0-5]:匹配 250 到 255 之间的数字。
2[0-4][0-9]:匹配 200 到 249 之间的数字。
[01]?[0-9][0-9]?:匹配 0 到 199 之间的数字。[01]? 允许 0 或 1 出现 0 或 1 次,[0-9][0-9]? 匹配 0 到 99 的数字。
\.:匹配点号(.)字符,注意点是特殊字符,需要用反斜杠转义。
{3}:表示前面括号中的内容(即三个部分的数字加点)重复 3 次。
最后一个部分没有 \.,因为它是最后一部分,不需要点。
import redef func_valid_ip(ip):pattern = r"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"if re.match(pattern, ip):print("{} 是一个有效的 IP 地址".format(ip))else:print("{} 不是一个有效的 IP 地址".format(ip))if __name__ == '__main__':ips = ['10.199.65.2', '192.168.1.1 ', '256.256.256.256', '10.10.10.300']for ip in ips:func_valid_ip(ip)

说明:
这个正则表达式严格按照 IPv4 地址的格式进行匹配。它检查每个数字段是否在 0 到 255 之间。
10.199.65.20 将被正确匹配,并且不会误匹配类似 999.999.999.999 的无效地址。
测试用例:

10.199.65.20 → 匹配成功,是有效的 IP 地址。
192.168.1.1 → 匹配成功,是有效的 IP 地址。
256.256.256.256 → 不匹配,因为 256 超过了有效的范围。
10.10.10.300 → 不匹配,因为 300 超过了有效的范围。

这个正则表达式适用于常规的 IPv4 地址验证。如果要进行更复杂的 IP 地址验证(比如子网掩码、IP 类别等),可以考虑扩展或使用专门的库。

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

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

相关文章

Zerotier + VSCode远程连接实验室的服务器、Xshell连接远程服务器

目录 1. 本地安装 Zerotier2. 使用本地CMD或者Xshell连接服务器:3. VSCode连接服务器 1. 本地安装 Zerotier Zerotier用来创建一个虚拟网络,可以将服务器和本机都加入该虚拟网络中。本地将会拥有一个内网ip地址,和服务器在一个网络下&#x…

gcd 生成4d

目录 推理示例: 开源地址 https://github.com/basilevh/gcd 推理示例: This section is for casually running our model on custom videos. For thorough quantitative evaluation on Kubric-4D or ParallelDomain-4D, or any command line inference outside of those t…

网安入门|前端基础之Html_css基础

Web1.0、Web2.0 和 Web3.0 是互联网发展的三个主要阶段,每个阶段有其独特的特征和技术进步。以下是对它们的介绍: Web 1.0(静态互联网) 时间:1990年代初到2000年代初 特点: 静态内容:网页主要…

开发平台接口规范:北斗终端->北斗三号卫星->指挥机(北斗终端)->北斗短报文融合平台->客户平台(上行)| 时空信息产品

文章目录 引言I 技术架构和业务流程技术架构北斗终端信息流II 渠道接口验证签名白名单IP渠道配置表设计III 其他辅助功能TCP 发送消息到消息中心nginx转发网关服务异常捕获日志采集IV 知识扩展对请求参数进行校验引言 开发平台的应用场景:平台需要开发能力给下游平台需要接收上…

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…

C语言中回调函数的注册及使用

1&#xff0c;回调函数类型定义 #include <stdio.h>// 定义回调函数类型 typedef void (*CallbackFunction)(int); 2&#xff0c;定义注册和调用回调函数的函数 // 存储回调函数的数组 CallbackFunction callbacks[10]; int callback_count 0;// 注册回调函数 void r…

SQL Server 解决游标性能问题的替代方案

在 SQL Server 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于逐行处理数据集的强大工具&#xff0c;但在某些情况下&#xff0c;它们可能会导致性能问题&#xff0c;尤其是在处理大量数据时。为了提高性能和可维护性&#xff0c;可以考虑使用其他替代方案。以下…

Vue3路由跳转动画引发页面抖动问题的解决方案

在现代Web应用中&#xff0c;动画不仅提升了视觉效果&#xff0c;还显著改善了用户体验。Vue3作为前端框架的佼佼者&#xff0c;以其强大的生态和灵活的API为开发者提供了丰富的动画实现方式。然而&#xff0c;在Vue3中为路由跳转增加动画效果时&#xff0c;开发者可能会遇到页…

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…

搭建Tomcat(六)---Response的实现

目录 引入 一、前端项目容器的搭建 重建项目: 1.创建一个新的项目&#xff1a; 2.创建HTML文件 3.将先前编写的所有tomcatJava文件挪过来 二、配置java文件 1.重启一下MyTomcat 2.配置两个工具包 ①FileUtil ②ResponseUtil&#xff08;响应头&#xff09; 三、处理…

机械鹦鹉与真正的智能:大语言模型推理能力的迷思

编者按&#xff1a; 大语言模型真的具备推理能力吗&#xff1f;我们是否误解了"智能"的本质&#xff0c;将模式匹配误认为是真正的推理&#xff1f; 本文深入探讨了大语言模型&#xff08;LLMs&#xff09;是否真正具备推理能力这一前沿科学问题&#xff0c;作者的核…

.net winform 实现CSS3.0 泼墨画效果

效果图 代码 private unsafe void BlendImages1(Bitmap img1, Bitmap img2) {// 确定两个图像的重叠区域Rectangle rect new Rectangle(0, 0,Math.Min(img1.Width, img2.Width),Math.Min(img1.Height, img2.Height));// 创建输出图像&#xff0c;尺寸为重叠区域大小Bitmap b…

VUE+Node.js+mysq实现响应式个人博客|项目初始化+路由配置+基础组件搭建

Day 1 开发文档&#xff1a;项目初始化与基础架构搭建 一、项目初始化 1. 创建项目 首先&#xff0c;我们使用 Vite 创建一个基于 Vue 3 的项目&#xff1a; # 创建项目 npm create vitelatest my-blog -- --template vue # 这条命令会创建一个名为 my-blog 的新项目&#…

短视频矩阵:构建多平台曝光的高效运营网络

在当今这个瞬息万变的数字化时代&#xff0c;短视频以其独特的魅力迅速占领了人们的视野&#xff0c;成为信息传播与娱乐消遣的重要一环。随着短视频平台的不断增多和用户群体的日益庞大&#xff0c;如何精准高效地利用短视频进行品牌推广和产品营销&#xff0c;成为了众多企业…

ubuntu+ros新手笔记(三):21讲没讲到的MoveIt2

系统ubuntu22.04 ros2 humble 1 安装MoveIt2 安装参照在ROS2中&#xff0c;通过MoveIt2控制Gazebo中的自定义机械手 安装 MoveIt2可以选择自己编译源码安装&#xff0c;或者直接从二进制安装。 个人建议直接二进制安装&#xff0c;可以省很多事。 sudo apt install ros-humbl…

Guava 提供了集合操作 `List`、`Set` 和 `Map` 三个工具类

入门示例 guava 最佳实践 学习指南 以下是使用Google Guava库中的工具方法来创建和操作List、Set、Map集合的一些示例&#xff1a; List相关操作 创建List 使用Lists.newArrayList()创建一个新的可变ArrayList实例。List<Integer> list Lists.newArrayList(1, 2, 3);/…

蓝桥杯摆烂第三天

小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入描述 输入的第一行包含一个整数 n (1≤n≤104)&#xff0c;表示考试人数。 接下来 n 行&#xff0c;每行包…

DotNetBrowser 3.0.0 正式发布!

&#x1f6e0;️ 重要消息&#xff1a;DotNetBrowser 3.0.0 正式发布&#xff01; 我们很高兴向您介绍全新的 DotNetBrowser 3.0.0 版本。此次更新带来了多项重要功能与优化&#xff0c;进一步提升了 Web 开发的效率和体验。 &#x1f4e2; DotNetBrowser 3.0.0 包含哪些新功…

C++ —— 使用指针

C —— 使用指针 解引用指针用于函数的参数 解引用 声明指针变量后&#xff0c;在没有赋值之前&#xff0c;这时候不能使用指针。因为&#xff0c;此时我们不知道指针里面装的是什么。 在声明变量后&#xff0c;应该养成对变量赋初始值的好习惯。 指针存放的是变量的地址&…

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c 1. Installing the extension (在 Visual Studio Code 中安装插件)1.1. Extensions for Visual Studio Code1.2. C/C1.2.1. Pre-requisites 1.3. Makefile Tools 2. Configuring your project (配置项目)2.1.…