Python 正则表达式全面解析

目录

一、引言

二、re 模块基础

(一)导入 re 模块

(二)常用方法详解

三、元字符详述

(一)单字符匹配元字符

(二)数量元字符

(三)边界元字符

(四)分组匹配元字符

四、正则表达式的高级应用

(一)复杂模式构建

(二)贪婪与非贪婪匹配

(三)正则表达式的修饰符

五、实战案例分析

(一)电子邮件地址验证

(二)URL 验证

(三)文本提取与替换

六、性能优化与注意事项

(一)性能优化技巧

(二)常见错误与解决方法

七、总结与展望


一、引言

在 Python 编程领域,正则表达式是一种强大且不可或缺的工具。它能够以简洁而灵活的方式处理文本数据,无论是在数据清洗、文本提取、模式匹配还是数据验证等任务中,都发挥着关键作用。例如,在网络爬虫程序里,正则表达式可精准地从网页 HTML 代码中提取出所需的文本信息,如文章标题、正文内容、链接地址等;在日志分析场景中,能迅速筛选出特定类型的日志记录,助力系统管理员快速定位问题;在用户输入数据验证环节,可严格检查输入的电子邮件地址、电话号码等是否符合规范格式。随着数据处理需求的日益增长,深入掌握 Python 正则表达式对于开发者来说至关重要。

二、re 模块基础

re 模块是 Python 中操作正则表达式的核心模块,其内置了丰富的函数和方法,为文本处理提供了强大的支持。

(一)导入 re 模块

在 Python 脚本或交互式环境中,使用 import re 语句即可引入 re 模块,开启正则表达式的编程之旅。

(二)常用方法详解

  1. findall 方法:此方法的主要功能是在给定字符串中查找所有与正则表达式匹配的子串,并将这些子串以列表形式返回。若未找到匹配项,则返回空列表。例如,在处理一段包含多个数字的文本时,re.findall(r'\d+', text) 能够快速提取出所有连续的数字序列,其中 r'\d+' 是正则表达式模式\d 表示数字+ 表示匹配前面的元素一次或多次
    import re
    text = '12121hg2v312v3hg12121g2v1gh3'
    list = re.findall(r'\d+', text)
    print(list)
  2. match 方法:它尝试从字符串的起始位置进行模式匹配。若匹配成功,将返回一个包含匹配信息的对象;若起始位置不匹配,则返回 None。通过该对象的 group 方法可获取匹配的字符,span 方法可获取匹配字符在原字符串中的下标取值区间。例如,re.match(r'python', 'python is great') 会成功匹配并返回匹配对象,而 re.match(r'java', 'python is great') 则返回 None
    a1 = re.match(r'python', 'python is great')
    a11 = a1.group()
    print(a11)
    a12 = a1.span()
    print(a12)
    a2 = re.match(r'java', 'python is great')
    print(a2)
  3. search 方法:该方法会扫描整个字符串以查找匹配项,一旦找到符合规则的子串,立即返回匹配对象。与 match 方法不同,它不局限于字符串起始位置。如 re.search(r'123', 'abc123def') 能够找到字符串中间的 123 并返回匹配对象,若未找到匹配内容,则返回 None
    a3 = re.search(r'123', 'abc123def')
    print(a3) # <re.Match object; span=(3, 6), match='123'>

三、元字符详述

元字符是正则表达式的重要组成部分,赋予了正则表达式强大的表达能力。

(一)单字符匹配元字符

  1. . 字符:它可以匹配除换行符 \n 之外的任意单个字符。在处理文本时,若不确定某个位置的具体字符,但知道其应为一个普通字符,就可使用 . 进行模糊匹配。例如,r'.at' 可以匹配 catbatsat 等以 at 结尾且前面为任意单字符的单词。
  2. [] 字符类:在方括号内列举的字符集合中进行匹配。例如,r'[abc]' 可以匹配 ab 或 c 中的任意一个字符。还可以使用范围表示法,如 r'[a-z] 匹配所有小写字母,r'[0-9] 匹配数字,r'[A-Z0-9] 匹配大写字母和数字。
  3. \d\D\s\S\w\W 元字符\d 用于匹配数字 0 - 9,在处理如电话号码、身份证号码等数字序列时非常有用;\D 则匹配非数字字符,可用于提取非数字部分的文本;\s 匹配空白字符,包括空格和制表符(tab),在处理文本排版或格式化数据时能发挥作用;\S 匹配非空白字符;\w 匹配单词字符,即字母(a - z、A - Z)、数字(0 - 9)和下划线 _,常用于提取变量名、单词等;\W 匹配非单词字符。

(二)数量元字符

  1. * 字符:表示匹配前一个字符出现 0 次或无限次。例如,r'ab*' 可以匹配 aababbabbb 等,即 b 可以出现任意多次(包括 0 次)。
  2. + 字符:匹配一个字符出现 1 次或无限次。如 r'ab+' 能匹配 ababbabbb 等,但不能匹配 a,因为 b 至少要出现 1 次。
  3. ? 字符:匹配一个字符出现 0 次或 1 次。例如,r'ab?' 可以匹配 a 或 abb 要么出现 1 次,要么不出现。
  4. {m}{m,}{m,n} 字符{m} 精确匹配前一个字符出现 m 次{m,} 匹配前一个字符至少出现 m 次;{m,n} 匹配前一个字符出现次数在 m 到 n 之间(包括 m 和 n)。例如,r'a{3}' 匹配 aaar'a{2,} 可以匹配 aaaaaaaaa 等,r'a{1,3} 可以匹配 aaaaaa

(三)边界元字符

  1. ^ 字符:用于匹配字符串的开头。在验证输入是否符合特定开头格式时非常实用,如 r'^python' 可检查字符串是否以 python 开头。
  2. $ 字符:匹配字符串的结尾。例如,r'\.com$' 可用于验证字符串是否以 .com 结尾,常用于电子邮件地址或网址的验证。

(四)分组匹配元字符

  1. | 字符:它可以匹配左右任意一个表达式。例如,r'python|java' 能够匹配 python 或 java 这两个单词中的任意一个,在需要匹配多种可能的文本模式时非常方便。
  2. () 字符:用于分组,将字符或元字符组合成一个整体进行匹配,并可在后续操作中通过分组编号名称引用匹配的内容。例如,r'(ab)+' 表示匹配 ab 这个组合出现 1 次或多次,r'(?P<name>\w+)@(?P<domain>\w+\.\w+)' 可以使用命名分组来匹配电子邮件地址,并通过分组名称获取用户名和域名部分。你可以使用 match.group('name')match.group('domain') 来获取相应的匹配结果。
    a4 = re.search(r'(?P<name>\w+)@(?P<domain>\w+\.\w+)', '22250@qq.com')
    print(a4.group('domain'))

四、正则表达式的高级应用

(一)复杂模式构建

在实际应用中,常常需要构建复杂的正则表达式模式来满足特定需求。例如,在处理日期格式时,可能需要匹配 YYYY-MM-DD 或 YYYY/MM/DD 等多种形式。可以使用 r'(\d{4})[-/](\d{2})[-/](\d{2})' 来实现,其中 \d{4} 匹配 4 位年份,[-/] 匹配连字符或斜杠,\d{2} 匹配 2 位月份和日期。通过这种方式,可以灵活地处理不同格式的日期数据。

(二)贪婪与非贪婪匹配

正则表达式默认采用贪婪匹配模式,即尽可能多地匹配字符。例如,对于字符串 <div>content1</div><div>content2</div> 和正则表达式 r'<div>.*</div>',贪婪匹配会返回整个字符串,因为 .* 会尽可能多地匹配中间的内容。若要实现非贪婪匹配,即匹配最短的符合条件的字符串,可以在数量元字符后加上 ?。如 r'<div>.*?</div>' 会分别匹配 <div>content1</div> 和 <div>content2</div>,只匹配到满足条件的最短字符串。

(三)正则表达式的修饰符

正则表达式修饰符用于改变正则表达式的匹配行为。常见的修饰符有:

  • re.I(忽略大小写):使正则表达式在匹配时不区分大小写。例如,re.findall(r'python', 'Python is great', re.I) 可以同时匹配 Python 和 python
  • re.M(多行模式):在多行文本中,^ 和 $ 可以匹配每一行的开头和结尾,而不仅仅是整个文本的开头和结尾。例如,在处理多行日志文件时,可方便地匹配每行的特定模式。
  • re.S(点号匹配换行符):使 . 元字符能够匹配换行符 \n,在处理包含换行的文本时非常有用。

五、实战案例分析

(一)电子邮件地址验证

验证电子邮件地址的正则表达式可以是 r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'。这个表达式首先使用 ^ 确保从字符串开头匹配,[a-zA-Z0-9_.+-]+ 匹配用户名部分,允许字母、数字、下划线、点、加号和减号出现多次;@ 是固定的分隔符;[a-zA-Z0-9-]+ 匹配域名部分,\.[a-zA-Z0-9-.]+ 匹配顶级域名,如 .com.net 等,最后使用 $ 确保匹配到字符串结尾。在 Python 中,可以使用 re.match 或 re.search 方法结合这个正则表达式来验证用户输入的电子邮件地址是否有效。

a5 = re.search(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', '222-50@qq.c-om.-net')
print(a5.group()) # 222-50@qq.c-om.-net

(二)URL 验证

验证 URL 的正则表达式相对复杂一些,例如 r'^(https?|ftp)://[^\s/$.?#].[^\s]*$'^(https?|ftp):// 匹配协议部分,允许 httphttps 或 ftp 协议;[^\s/$.?#] 匹配域名部分,排除空格、斜杠、美元符号、点号、问号和井号等特殊字符;.[^\s]*$ 匹配路径部分,允许除空格外的任意字符,并确保匹配到字符串结尾。通过这种方式,可以有效地验证用户输入的 URL 是否符合基本格式。

a6 = re.search(r'^(https?|ftp)://[^\s/$.?#].[^\s]*$', 'https://mp.csdn.net')
print(a6) # <re.Match object; span=(0, 19), match='https://mp.csdn.net'>

(三)文本提取与替换

在网页爬虫中,从 HTML 页面提取文本内容时,可以使用正则表达式去除 HTML 标签。例如,re.sub(r'<.*?>', '', html_text) 可以将 html_text 中的所有 HTML 标签(<.*?> 匹配任意 HTML 标签)替换为空字符串,从而提取出纯文本内容。在文本处理中,还可以使用正则表达式提取特定格式的数据,如提取文章中的所有电话号码,使用 r'\d{3}-\d{8}|\d{4}-\d{7}' 来匹配常见的电话号码格式,并通过 re.findall 方法获取所有匹配的电话号码。

html_text = '<html><body>hello world</body></html>'
a7 = re.sub(r'<.*?>', '', html_text)
print(a7) # hello world

s = '111-222-3333'
a8 = re.findall(r'\d{3}-\d{8}|\d{4}-\d{7}', html_text)
print(a8) # []

六、性能优化与注意事项

(一)性能优化技巧

  1. 尽量使正则表达式简洁明了,避免复杂的嵌套和不必要的重复模式。例如,在匹配数字时,如果只需要匹配整数,使用 \d+ 比 [0-9]+ 更简洁高效。
  2. 合理使用字符类和范围表示法,减少不必要的字符列举。如 [a-zA-Z] 比逐个列出所有字母更简洁,且在匹配时性能更好。
  3. 在循环中使用正则表达式时,尽量将正则表达式对象提前编译,避免每次循环都重新编译正则表达式。可以使用 re.compile 函数创建预编译的正则表达式对象,例如 pattern = re.compile(r'\d+'),然后在循环中使用 pattern.findall(text) 进行匹配。

(二)常见错误与解决方法

  1. 转义字符错误:在正则表达式中,某些字符具有特殊含义,如 .*+ 等。如果要匹配这些字符本身,需要使用转义字符 \。但在 Python 字符串中,\ 本身也需要转义,所以可能会出现转义错误。例如,要匹配 .,应该使用 r'\.' 而不是 '\.'
  2. 正则表达式语法错误:常见的语法错误包括括号不匹配、元字符使用错误等。在编写复杂的正则表达式时,仔细检查语法,确保每个元字符和分组都正确使用。可以使用在线正则表达式测试工具或 Python 的交互式环境进行调试,逐步修改和完善正则表达式。

七、总结与展望

Python 正则表达式是文本处理领域的强大武器,通过 re 模块、丰富的元字符和灵活的模式构建方法,能够高效地解决各种文本处理任务。从简单的字符串匹配到复杂的数据提取和验证,正则表达式都展现出了其独特的优势。随着数据处理技术的不断发展,正则表达式在数据分析、人工智能、自然语言处理等领域的应用也将更加广泛。对于 Python 开发者来说,深入学习和掌握正则表达式的原理、语法和应用技巧,将有助于提升编程能力,更好地应对各种实际项目中的文本处理需求,在数据处理的道路上更加得心应手,为开发高效、健壮的应用程序奠定坚实的基础。未来,正则表达式可能会在性能优化、与新兴技术的融合等方面继续发展,开发者需要持续关注并学习新的知识和技能,以适应不断变化的编程环境。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于kraft部署kafka集群

kafka介绍 Apache Kafka 是一个开源的分布式事件流平台&#xff0c;被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。 Kafka是一个拥有高吞吐、可持久化、可水平扩展&#xff0c;支持流式数据处理等多种特性的分布式消息流处理中间件&#xff0c;采用分布式…

Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格

目录 1.工作台 1.1 需求分析和设计 1.1.1 产品原型 1.1.2 接口设计 1.2 代码导入 1.2.1 Controller层 1.2.2 Service层接口 1.2.3 Service层实现类 1.2.4 Mapper层 1.3 功能测试 1.4 代码提交 2.Apache POI 2.1 介绍 2.2 入门案例 2.2.1 将数据写入Excel文件 2.2.2 读取Excel文…

Web前端基础知识(三)

表单的应用非常丰富&#xff0c;可以说&#xff0c;每个网站都会用到表单。下面首先介绍表单中的form标签。 --------------------------------------------------------------------------------------------------------------------------------- <form></form&g…

NLP中的神经网络基础

一&#xff1a;多层感知器模型 1&#xff1a;感知器 解释一下&#xff0c;为什么写成 wxb>0 &#xff0c;其实原本是 wx > t ,t就是阈值&#xff0c;超过这个阈值fx就为1&#xff0c;现在把t放在左边。 在感知器里面涉及到两个问题&#xff1a; 第一个&#xff0c;特征提…

docker安装MySQL--宝塔面板操作版

记录 1 在centos中安装宝塔面板 参照宝塔面板官方网页上步骤进行操作&#xff0c;然后登录网页地址 成功后直接拉取 成功后可以在本地镜像中看到 2 创建配置文件 cd /home/mysql/conf vim my.cnf [rootplmomn-gw conf]# cat /home/mysql/conf/my.cnf [client] #设置客户端…

C++简明教程(3)(初识VS)

一、编程工具大揭秘——IDE 当我们准备踏入 C 编程的奇妙世界时&#xff0c;首先要认识一个重要的“魔法盒子”——集成开发环境&#xff08;IDE&#xff09;。IDE 就像是一个全能的编程工作室&#xff0c;它把我们写代码所需要的各种工具都整合到了一起&#xff0c;让编程这件…

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题&#xff0c;其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法&#xff0c;能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏&#xff0c;如金手指氧化、芯片…

分布式调度框架学习笔记

一、分布式调度框架的基本设计 二、线程池线程数量设置的基本逻辑 cpu是分时复用的方法&#xff0c;线程是cpu调度的最小单元 如果当前cpu核数是n&#xff0c;计算密集型线程数一般设为n&#xff0c;io密集型(包括磁盘io和网络io)线程数一般设置为2n. 计算密集型线程数一般设…

快速排序算法 -- 深入研究

一 . 快排性能的关键点分析 快排性能的关键点分析 : 决定快排性能的关键点是每次单趟排序后 &#xff0c; key 对数组的分割 &#xff0c; 如果每次选key 基本二分居中&#xff0c;那么快排的递归树就是颗均匀的满二叉树&#xff0c;性能最佳。但是实际中虽然不可能每次都是二…

ORA-65198 PDB clone 时 不能新加datafile 以及hang的一个原因

create pluggable database XX from SS keystore identified by "YYY" parallel 32 service_name_convert( _srv, _srv); 20TB 4小时 update /* rule */ undo$ set name:2,file#:3,block#:4,status$:5,user#:6,undosqn:7,xactsqn:8,scnbas:9,scnwrp:10,inst#:11,…

Android--java实现手机亮度控制

文章目录 1、开发需求2、运行环境3、主要文件4、布局文件信息5、手机界面控制代码6、debug 1、开发需求 需求&#xff1a;开发一个Android apk实现手机亮度控制 2、运行环境 Android studio最新版本 3、主要文件 app\src\main\AndroidManifest.xml app\src\main\res\layou…

HarmonyOS NEXT 实战之元服务:静态案例效果--- 日出日落

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

一起学Git【番外篇:如何在Git中新建文件】

在介绍Git之前&#xff0c;我们需要了解一下如何在Git里添加、编辑和删除文件。 首先&#xff0c;需要使用文件编辑器进行文件的创建&#xff0c;常见的文件编辑器有以下几种&#xff1a; Vim&#xff1a;一种基于命令行的编辑器&#xff0c;功能强大&#xff0c;适合开发者和…

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行&#xff0c;常常需要在狭窄的空间内完成货物的搬运和堆垛&#xff0c;这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离&#xff0c;然而这种方式往往存在误差&#xff0c;特别是在视线受阻或光…

hi168大数据离线项目环境搭建

hi168大数据离线项目环境搭建 ## **1. 服务器准备**##### 1.1 创建集群应用节点 集群服务器使用“我的应用“中的Ubuntu22.04集群模版创建三个节点应用&#xff0c;并且进入“我的应用”中去修改一下节点名称&#xff08;node1对应master&#xff0c;node2对应hadoop1&#xf…

分布式专题(10)之ShardingSphere分库分表实战指南

一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在…

大模型-Ollama使用相关的笔记

大模型-Ollama使用相关的笔记 解决Ollama外网访问问题&#xff08;配置ollama跨域访问&#xff09;Postman请求样例 解决Ollama外网访问问题&#xff08;配置ollama跨域访问&#xff09; 安装Ollama完毕后&#xff0c; /etc/systemd/system/ollama.service进行如下修改&#…

Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)

模拟题&#xff1a;直接按照题目含义模拟即可&#xff0c;一般不涉及算法 注意&#xff1a; 1.读懂题&#xff1a;理清楚题目流程 2.代码和步骤一一对应&#xff1a;变量名&#xff0c;函数名&#xff0c;函数功能 3.提取重复的部分&#xff0c;写成对应的函数&#xff08;…

【数据库初阶】数据库基础知识

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 数据库…

汽车IVI中控开发入门及进阶(四十):FDK AAC音频编解码软件库

概述: FDK AAC是一个用于编码和解码高级音频编码格式音频的开源软件库,由Fraunhofer IIS开发,并作为Android的一部分包含在内。它支持多种音频对象类型,包括MPEG-2和MPEG-4 AAC LC、HE-AAC、HE-AACv2以及AAC-LD和AAC-ELD,用于实时通信。编码库支持高达96 kHz的采样率和多…