深入探讨Python正则表达式

则表达式(Regular Expressions,简称 regex 或 regexp)是一种强大的文本处理工具,可以用于搜索、匹配、替换、分割等操作。Python 的 re 模块提供了丰富的正则表达式功能。


一、正则表达式的基础知识

正则表达式是一种模式匹配工具,用于在文本中查找符合特定规则的字符串。以下是一些基本语法:

符号描述示例匹配
.任意单个字符(除换行符外)a.b"aab", "acb"
^匹配字符串的开始^Hello"Hello World"
$匹配字符串的结尾end$"The end"
*前一个字符重复 0 次或多次ab*"a", "ab", "abbb"
+前一个字符重复 1 次或多次ab+"ab", "abbb"
?前一个字符重复 0 次或 1 次colou?r"color", "colour"
{n}前一个字符重复 n 次a{3}"aaa"
{n,m}前一个字符重复 n 至 m 次a{2,4}"aa", "aaa", "aaaa"
[]字符集,匹配其中任意一个字符[aeiou]"a", "e", "i"
``或,匹配任意一个规则`cat
\d数字,等价于 [0-9]\d{3}"123", "456"
\w字母、数字或下划线,等价于 [a-zA-Z0-9_]\w+"word123"
\s空白字符(包括空格、制表符等)\s+" ", "\t"

二、re 模块的常用函数

Python 的 re 模块封装了一组方法,以下是常用方法及其作用:

1. re.match()

从字符串开头尝试匹配一个模式。

import re text = "hello world"

result = re.match(r"hello", text)

print(result.group()) # 输出: hello

2. re.search()

搜索整个字符串,返回第一个匹配项。

result = re.search(r"world", text)

print(result.group()) # 输出: world

3. re.findall()

返回所有匹配项的列表。

result = re.findall(r"\d+", "Order 123, Item 456")

print(result) # 输出: ['123', '456']

4. re.finditer()

返回一个迭代器,包含所有匹配项。

for match in re.finditer(r"\d+", "Order 123, Item 456"):            print(match.group()) # 输出: 123, 456

5. re.sub()

替换匹配的子字符串。

result = re.sub(r"\d+", "#", "Order 123, Item 456")

print(result) # 输出: Order #, Item #

6. re.split()

按照匹配的模式拆分字符串。

result = re.split(r"\s+", "Split this string by spaces") print(result) # 输出: ['Split', 'this', 'string', 'by', 'spaces']


三、常见用法场景

1. 验证邮箱地址

email = "user@example.com"

pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"

if re.match(pattern, email):

   print("Valid email")

else:

   print("Invalid email")

2. 提取电话号码

text = "Call me at 123-456-7890 or 987-654-3210."

pattern = r"\d{3}-\d{3}-\d{4}"

matches = re.findall(pattern, text)

print(matches) # 输出: ['123-456-7890', '987-654-3210']

3. 清除HTML标签

html = "<p>This is a <b>bold</b> paragraph.</p>"

cleaned = re.sub(r"<.*?>", "", html)

print(cleaned) # 输出: This is a bold paragraph.

4. 分割多种分隔符的文本

text = "apple;orange,banana|grape"

fruits = re.split(r"[;|,]", text)

print(fruits) # 输出: ['apple', 'orange', 'banana', 'grape']

5. 密码强度检查

password = "Passw0rd!"

pattern = r"^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$"

if re.match(pattern, password):

    print("Strong password")

else:

    print("Weak password")


四、正则表达式的高级技巧

1. 非捕获组与捕获组
  • 捕获组:(pattern),用于提取特定内容。
  • 非捕获组:(?:pattern),匹配但不捕获。

text = "2024-12-09"

pattern = r"(\d{4})-(\d{2})-(\d{2})"

match = re.match(pattern, text)

print(match.groups()) # 输出: ('2024', '12', '09')

2. 懒惰匹配与贪婪匹配
  • 贪婪匹配:.* 尽可能多地匹配。
  • 懒惰匹配:.*? 尽可能少地匹配。

text = "<tag>content</tag>"

greedy = re.search(r"<.*>", text).group()

lazy = re.search(r"<.*?>", text).group()

print(greedy) # 输出: <tag>content</tag>

print(lazy) # 输出: <tag>

3. 回溯控制

避免复杂模式导致的回溯过多可以提高效率。例如:

pattern = r"(a|b)+c"

text = "a" * 100 + "c"

match = re.match(pattern, text)

print(bool(match)) # 输出: True


五、性能优化建议

  1. 预编译正则表达式 如果同一个模式需要多次使用,建议预编译:

pattern = re.compile(r"\d+")

matches = pattern.findall("123 456 789")

  1. 避免过度复杂的模式 使用简单且明确的模式可以减少回溯。

  2. 使用原始字符串 避免转义混乱,始终使用 r"..." 格式定义正则表达式。


六、工具推荐与调试技巧

  1. 在线正则表达式测试工具

    • Regex101:支持 Python 语法,实时调试。
    • Regexr:可视化正则表达式工具。
  2. 调试技巧

    • 使用分步测试:先验证小的子模式,再逐步组合。
    • 使用 re.DEBUG 查看正则表达式编译过程:

      re.compile(r"\d+", re.DEBUG)


七、总结

正则表达式是处理文本的利器,但也需要小心使用以避免过度复杂的模式和性能问题。通过合理使用 Python 的 re 模块和调试工具,可以有效地解决各种实际问题。

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

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

相关文章

47 基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

文章目录 解决&#xff1a;IDEA中Autowired自动注入MyBatis Mapper报红警告的几种解决方法问题描述&#xff1a;解决办法&#xff1a;1.将Autowired注解改成Resource2.给Autowired(required false)设置属性3.给Mapper层加注解Mapper/Repository4.改变写法,用RequiredArgsConst…

Spring Boot中实现JPA多数据源配置指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始&#xff0c;到配置数据源、创建DataSource bean、定义实体和Repository&#xff0c;最后到配置事务管理器和使用多数据…

Ubuntu 安装 web 服务器

安装 apach sudo apt install apache2 -y 查看 apach2 版本号 apache2 -v 检查是否启动服务器 sudo service apache2 status 检查可用的 ufw 防火墙应用程序配置 sudo ufw app list 关闭防火墙 sudo ufw disable 更改允许通过端口流量 sudo ufw allow Apache Full 开启…

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print&#xff1a; println&#xff1a; printf&#xff1a; 总结&#xff1a; 代码展示&#xff1a; 二、格式化占位符 %s&#xff1a;用于格式化字符串。 %d&#xff1a;用于格式化整数。 %f&#xff1a;用于格式化浮点数。 %v&#xff1…

【Linux操作系统】Linux常用一键脚本

Linux网络加速脚本 Linux网络加速脚本可以替换Linux内核和更改TCP拥塞算法的一键脚本&#xff0c;包括安装BBR内核、XANMOD官方内核&#xff0c;开启BBR加速等功能&#xff0c;总之非常强大。 不卸载内核脚本&#xff08;一般用这个&#xff09; wget -O tcpx.sh "http…

【全攻略】React Native与环信UIKit:Expo项目从创建到云打包完整指南

前言 在当今快速发展的移动应用领域&#xff0c;React Native 因其跨平台开发能力和高效的开发周期而受到开发者的青睐。而 Expo&#xff0c;作为一个基于 React Native 的框架&#xff0c;进一步简化了开发流程&#xff0c;提供了一套完整的工具链&#xff0c;使得开发者能够…

乌龟咬人,小意外中的大警示

近日&#xff0c;听闻有朋友被自家乌龟咬了手指&#xff0c;这看似滑稽的小意外&#xff0c;实则蕴含着不少值得我们深思的安全与责任问题。 乌龟&#xff0c;在大众的认知里&#xff0c;向来是行动迟缓、性情温和的宠物代表。它们慢悠悠地爬行&#xff0c;憨态可掬的模样常常…

java+springboot+mysql论文分享平台

项目介绍&#xff1a; 使用javaspringbootmysql开发的论文分享平台&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 用户&#xff1a;系统前台首页&#xff1b;论文分类&#xff1b;论文共享&#xff08;用户可以上传、下载、评论论文文档…

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果&#xff08;以猫为例&#xff09; JavaScript 实现 Scratc…

帝可得-运营管理App

运营管理App Android模拟器 本项目的App客户端部分已经由前端团队进行开发完成&#xff0c;并且以apk的方式提供出来&#xff0c;供我们测试使用&#xff0c;如果要运行apk&#xff0c;需要先安装安卓的模拟器。 可以选择国内的安卓模拟器产品&#xff0c;比如&#xff1a;网…

案例-商品列表(组件封装)

标签组件封装 1.双击显示&#xff0c;自动聚焦 2.失去焦点&#xff0c;隐藏输入框 标签一列&#xff0c;不同行的标签内容不同&#xff0c;但是除此之外其他基本一致&#xff0c;所以选择用 标签组件 将这一部分封装为一个组件&#xff0c;需要时组件标签展示。 首先标签处一进…

Linux socket编程

目录 基础概念端口和端口号Socket&#xff08;套接字&#xff09;UDP和TCP的概念 Socket编程实战socket的类型struct sockaddrstruct sockaddr_in网络字节序socket APITCP网络编程流程分析UDP Demo样例 other概念补充setsockopt函数心跳机制面向字节流与面向报文的理解 参考 基…

Linux update-alternatives 命令详解

1、查看所有候选项 sudo update-alternatives --list &#xff08;java筛选​​​​​​​sudo update-alternatives --list java&#xff09; 2、​​​​​​​更换候选项 sudo update-alternatives --config java 3、自动选择优先级最高的作为默认项 sudo update-alterna…

unity3d—demo(2d人物左右移动发射子弹)

目录 人物代码示例&#xff1a; 子弹代码示例&#xff1a; 总结上面代码&#xff1a; 注意点&#xff1a; 人物代码示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerTiao : MonoBehaviour {public f…

JSP技术发展现状

多年前&#xff0c;Java入门时学习的JSP可谓时风光无限&#xff0c;J2EE如日中天&#xff0c;短短数年&#xff0c;技术迭代更新光速般发展&#xff0c;有些技术慢慢就退出历史舞台。 JSP&#xff08;Java Server Pages&#xff09; 技术在早期 Java Web 开发中曾是构建动态网…

科技绽放-EtherCAT转Profinet网关智能连接项目

一、项目名称 备选名称及含义&#xff1a;开疆智能EtherCAT转Profinet网关智能连接项目&#xff1a;直接体现了从Profinet到EtherCAT的连接核心内容&#xff0c;智能连接突出了该项目的技术特点。工业互联方案强调了该项目在工业领域实现不同协议设备互联的目标&#xff0c;方案…

《计算机网络》(408大题)

2009 路由转发和静态路由的计算 子网划分、路由聚合的计算 注&#xff1a;CIDR中的子网号可以全为0或1&#xff0c;但是其主机号不允许。 注&#xff1a; 这里其实是把到互联网的路由当做了一个默认路由&#xff08;当一个目的网络地址与路由表中其他都不匹配时&#xff0c;…

matlab读取NetCDF文件

matlab对NetCDF文件进行信息获取和读取数据 文章目录 前言一、什么是NetCDF文件二、读取NetCDF文件数据 1.引入库 2.读入数据总结 前言 在气象学中&#xff0c;许多气象数据存储在NetCDF文件中&#xff0c;后缀为.nc&#xff0c;通常可以用NCL、python和MATLAB等对该…

MySQL用户管理、权限管理练习

1.使用root用户登录MySQL客户端&#xff0c;创建一个名为userl的用户&#xff0c;初始密码为123456; 创建一个名为user2的用户&#xff0c;无初始密码。然后&#xff0c;分别使用uesr1、user2登录MySQL 客户端。 2.使用root用户登录&#xff0c;将user2用户的密码修改为abcabc。…