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

news2024/12/21 6:32:40

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)}")  # 输出 123
    print(f"第二组: {match.group(2)}")  # 输出 456
    print(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 re

def 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.coloradmin.cn/o/2263118.html

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

相关文章

apache应用(客户机地址限制、用户授权限制、日志分割、AWStats日志分析)

目录 一、 客户机地址限制 二、 用户授权限制 三、 日志分割 使用rotatelogs分割工具 使用第三方工具cronolog 四、 AWStats日志分析 具体的apache软件安装可以阅读我之前的文章apache安装https://blog.csdn.net/m0_68472908/article/details/139348739?spm1001.2014.300…

护士资格实践题库(含解析)

1.患者女,30岁。诊断类风湿关节炎入院,经使用药物治疗后患者关节疼痛减轻,但出现体重增加、满月脸、向心性肥胖。提示存在何种药物的副作用( ) A.泼尼松 B.环磷酰胺 C.硫唑嘌呤 D.吲哚美辛 E.阿司匹林 【答案】…

网络安全概论——防火墙原理与设计

一、防火墙概述 防火墙是一种装置,它是由软件/硬件设备组合而成,通常处于企业的内部局域网与 Internet 之间,限制 Internet 用户对内部网络的访问以及管理内部用户访问 Internet 的权限。换言之,一个防火墙在一个被认为是安全和可…

接口测试-Fidder及jmeter使用

一、接口测试的基础 1.接口的含义 也叫做API,是一组定义、程序及协议的集合,提供访问一组例程的能力,无需访问源码获理解内部工作细节 2.接口的分类 代码内部的接口,程序模块间的接口,对于程序接口测试,需…

postman设置cookie

postman发送请求的时候,如何顺带cookie? 示例: Cookie: locale_areazh; contryzh_cn;

Java-31 深入浅出 Spring - IoC 基础 启动IoC XML与注解结合的方式 配置改造 applicationContext.xml

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

jmeter连接mysql

查询mysql数据库版本 SELECT VERSION(); 下载jmeter mysql 驱动jar包,版本低于mysql版本,放在jmeter的lib 路径下 MySQL :: Download MySQL Connector/J (Archived Versions) 添加JDBC Connection Configuration 填写 variable name 及数据库信息 注意…

计算机网络基础(2):网络安全/ 网络通信介质

1. 网络安全威胁 网络安全:目的就是要让网络入侵者进不了网络系统,及时强行攻入网络,也拿不走信息,改不了数据,看不懂信息。 事发后能审查追踪到破坏者,让破坏者跑不掉。 网络威胁来自多方面&#xff1a…

数据分析实战—IMDB电影数据分析

1.实战内容 1.加载数据到movies_df,输出前5行,输出movies_df.info(),movies_df.describe() # (1)加载数据集,输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…

windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网

一、应用场景说明 当我们的一台windows服务器中毒,变成别人肉鸡,不断向外请示非法网站或攻击其它服务器。 要彻底清除相关木马或病毒往往需要的时间比较长,比较有效的方法是禁止服务器主动向外发包除了网站端口和远程程序除外。 其实这就是一…

线性代数基础与应用:基底 (Basis) 与现金流及单期贷款模型(中英双语)

具体请参考:https://web.stanford.edu/~boyd/vmls/ 下面的例子来源于这本书。 线性代数基础与应用:基底 (Basis) 与现金流及单期贷款模型 在线性代数中,基底(Basis)是一个重要的概念,广泛应用于信号处理、…

微信小程序的消息头增加的字段不能有下滑线,字段大写字母自动转换消息字母

微信小程序的消息头增加的字段不能有下滑线,字段大写字母自动转换消息字母。这个是微信小程序的坑。 正式环境: 微信小程序的消息头增加了一个字段device_id,结果node.js打印出来的字段没有该字段。 [2024-12-20T09:45:54.476] [DEBUG] app - ctx.head…

【Java项目】基于SpringBoot的【旅游管理系统 】

【Java项目】基于SpringBoot的【旅游管理系统 】 技术简介:本系统使用JAVA语言开发,采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介:(1)管理员功能:可以管理个人中心、用户管理、景区分…

游戏引擎学习第55天

仓库: https://gitee.com/mrxiao_com/2d_game 介绍 今天的主题是让世界存储真正实现稀疏化,即便当前效率可能并不高。我们计划花一些时间处理这个问题,并探讨相关的成本。稀疏化世界存储是接下来的重要步骤,为此需要逐步实施。 修复 SetCa…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果,它们在底层是怎样做的? 2.Spring给我们提供了很多扩展点,这些有了解吗? 3.MVC分层介绍一下? 4.了解SpringMVC的处理流程吗? 5.Handlermapping 和 handleradapter有…

Linux限制root 用户的远程登录(安全要求)

前言:现在基本用户主机都不允许使用root来操作,所以本文通过创建新用户,并限制root用户的ssh来解决这个问题 1. 创建新账户 aingo 首先,使用 root 账户登录系统。 sudo useradd aingo设置 aingo 账户密码: sudo pa…

mysql的事务和存储引擎+备份

mysql的事务和存储引擎备份 一. mysql的事务1.1 mysgl支持事务四种隔离级别1.2 事务控制语句1.3 行锁和死锁1.3.1 行锁1.3.2 死锁1.3.3 如何避免死锁的发生 二. msyql的备份和还原以及日志管理2.1 数据库备份的分类2.2 备份策略2.2.1 物理冷备份(全量)2.…

raid 状态查看 storcli64

场景 当磁盘报错的时候使用该命令排查 fdisk -l /dev/sdb fdisk: cannot open /dev/sdb: Input/output error进一步使用 smartctl 排查 smartctl -a /dev/sdb 输出 smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-144-generic] (local build) Copyright (C) 2002-19, B…

[搜广推]王树森推荐系统——双塔模型

内容概览 矩阵补充模型 矩阵补充模型输入用户ID 和 物品ID,利用embedding把 用户ID 和 物品ID 映射成向量,输出向量的内积(一个实数),内积越大说明用户对这个物品越感兴趣 详见[搜广推]王树森推荐系统——矩阵补充&a…

96 vSystem

vSystem系统 1 技术背景 网络虚拟化旨在构建出一套与网络底层物理拓扑相互独立的逻辑网络环境,提供给不同需求的用户使用。基于这种思想,诞生出了 VLAN 技术和 VPN 技术。近年来, 随着以 VMM(Virtual Machine Monitor&#xff0c…