一 正则表达式库

正则表达式是文本处理中不可或缺的强大工具,Python通过re模块提供了完整的正则表达式支持。本文将详细介绍re模块中最常用的match()search()findall()函数,以及贪婪模式与非贪婪模式的区别,帮助读者掌握Python中正则表达式的核心用法。

1. re.match()函数:从字符串开头匹配

re.match()是正则表达式最基本的函数之一,它尝试从字符串的起始位置匹配一个模式。

基本语法与参数

re.match(pattern, string, flags=0)
  • pattern​:要匹配的正则表达式字符串或预编译的正则对象
  • string​:要匹配的目标字符串
  • flags​:可选标志,用于控制正则表达式的匹配方式

返回值特性

  • 匹配成功时返回Match对象
  • 匹配失败时返回None

典型使用示例

import rea='1,2,3,4,5'result1=re.match('1,',a)#必须以这个参数开头才行
result2=re.match('2',a)print(result1)    #返回match对象
print(result2)  #结果为空
<re.Match object; span=(0, 2), match='1,'>

其中span参数代表匹配成功 的起始和末尾的位置。match代表匹配的值为什么

2. re.search()函数:扫描整个字符串

match()不同,re.search()扫描整个字符串查找第一个匹配项,不限于字符串开头。

基本语法

re.search(pattern, string, flags=0)

参数与match()相同,但行为不同。

import re
a='1,2,3,4,5,3'
result=re.search('3',a)  #可以不以这个参数开头,但只返回第一个匹配的信息
print(result)
<re.Match object; span=(4, 5), match='3'>

 根据输出结果我们可以看出,search()只返回了第一个查到的值的信息。

与match()的关键区别

特性re.match()re.search()
匹配位置仅字符串开头字符串任意位置
使用频率较少较多
性能稍快稍慢
典型用途验证开头格式查找内容

3. re.findall()函数:查找所有匹配项

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

基本语法

re.findall(pattern, string, flags=0)

返回值特点

  • 返回包含所有匹配子串的列表
  • 没有匹配时返回空列表
  • 如果正则中有分组,则返回分组元组列表
import re
a='as1m,23f,asd3,23f,112'
res1=re.findall('2',a)
print(res1)
['2', '2', '2']

 可以看出,这个把匹配的所有结果都返回了,但我们也会发现,这个返回的是一个列表形式,很利于处理。

与match/search的区别

  • match:只在开头查找单个匹配
  • search:在整个字符串查找单个匹配
  • findall:查找所有非重叠匹配

前面只是开胃小菜,下面请看他们结合正则表达式所展现的绚丽操作吧

4 表示字符范围

        先举例子再说概念

import re
massage='pig98dog80'
res1=re.findall('[io]',massage)
res2=re.findall('[a-z]',massage)
res3=re.findall('[0-9]',massage)
print(res1)
print(res2)
print(res3)

输出

['i', 'o']
['p', 'i', 'g', 'd', 'o', 'g']
['9', '8', '8', '0']

 根据上面实例我们可以看出

[io]所表示的是在这个字符串中,出现i或o都会被提取出来,类比,我们也可以想到[90]表示的不是90,而是表示这个‘9’和‘0’两个字符

[a-z]所表示的是在这个字符串中,出现在a-z范围中的都会被提取出来

[0-9]所表示的是在这个字符串中,出现在0-9范围中的都会被提取出来

5 表示字符出现的次数

还是先举例子再说概念

import remassage='abcdacdabb'
res=re.findall('ab*',massage)
print('ab*型:',res)res1=re.findall('ab+',massage)
print('ab+型:',res1)res2=re.findall('ab?',massage)
print('ab?型:',res2)

结果

ab*型: ['ab', 'a', 'abb']
ab+型: ['ab', 'abb']
ab?型: ['ab', 'a', 'ab']

 根据这个结果,在格式上我们可以看出区别,b后面跟的分别是*+?,然后结果也很明显,第一种b分别出现了0,1,2次,第二种b分别出线了1,2次,第三种情况出现了1,0,1次

我们我们可以知道

ab*这种类型,可以提取*前面的数据(字母,数字,或者符号)出现任意次数的情况

ab+这种类型,可以提取*前面的数据(字母,数字,或者符号)最少出现一次的类型

ab*这种类型,可以提取*前面的数据(字母,数字,或者符号)出现0-1次的类型

import re
message='0123456'
mes=re.findall('^0',message)
mes1=re.findall('^6',message)
mes2=re.findall('0$',message)
mes3=re.findall('6$',message)
print('^0型',mes)
print('^6型',mes1)
print('0$型',mes2)
print('6$型',mes3)

输出

^0型 ['0']
^6型 []
0$型 []
6$型 ['6']

 我们可以看出在对于同一串字符串,当0在行首时^0就可以识别出来有结果,^6就返回空值,同理$也是

所以

^所选这的是这个字符后面在行首的情况

$所选这的是这个字符前面在行尾的情况

res=re.findall('f[o]{3}',a)
res1=re.findall('f[o]{3,}',a)
res2=re.findall('f[o]{3,6}',a)
print(res)
print(res1)
print(res2)

 结果

['fooo']
['foooooooooooo']
['foooooo']

 这个我们可以看出[o]{3}就对于ooo,[o]{3,}结果就是取了全部的o,[o]{3,6}取了最大6个o

总结

ab*这种类型,可以提取*前面的数据(字母,数字,或者符号)出现任意次数的情况

ab+这种类型,可以提取*前面的数据(字母,数字,或者符号)最少出现一次的类型

ab*这种类型,可以提取*前面的数据(字母,数字,或者符号)出现0-1次的类型

^所选这的是这个字符后面在行首的情况

$所选这的是这个字符前面在行尾的情况

[o]{3} 表示3个

[o]{3,} 表示3个以上

{o]{3,6} 表示3-6个但一般没有参数控制会是6个

6 表示同一类字符

正则表达式元字符详解

以下是对常用正则表达式元字符的解释和用法说明:

\d 匹配任意数字字符,等价于 [0-9]。例如匹配电话号码中的数字部分。

\D 匹配任意非数字字符,等价于 [^0-9]。例如匹配非数字分隔符。

\s 匹配任意空白字符,包括空格、制表符、换行符等。例如匹配文本中的空格分隔符。

\S 匹配任意非空白字符。例如匹配连续的非空白文本。

\w 匹配任意单词字符,包括字母、数字和下划线,等价于 [A-Za-z0-9_]。例如匹配变量名。

\W 匹配任意非单词字符。例如匹配特殊符号。

\b 匹配单词边界。例如精确匹配整个单词 "the" 可以写作 \bthe\b

\B 匹配非单词边界。例如匹配 "the" 但排除 "there" 中的 "the"。

\f 匹配换页符(Form feed)。

\n 匹配换行符(Line feed)。

\r 匹配回车符(Carriage return)。

\v 匹配垂直制表符(Vertical tab)。

. 匹配除换行符外的任意单个字符。例如匹配 "a.c" 可以匹配 "abc"、"aXc" 等。

使用示例

// 匹配所有数字
a = "123abc".match(/\d/g); // ["1", "2", "3"]// 匹配非数字
b = "123abc".match(/\D/g); // ["a", "b", "c"]// 匹配空白字符
c = "a b\tc".match(/\s/g); // [" ", "\t"]// 匹配单词边界
d = "hello world".match(/\b\w+\b/g); // ["hello", "world"]

这些元字符可以组合使用构建更复杂的正则表达式模式,满足各种文本匹配需求。

6. 贪婪模式与非贪婪模式

正则表达式中的量词(如*, +, ?, {})默认采用贪婪匹配,会尽可能多地匹配字符。通过在量词后添加?可启用非贪婪匹配,尽可能少地匹配字符。

贪婪匹配示例

text = "Here is <div>sometext</div> with <div>tags</div>."
pattern = r'<.*>'
match = re.search(pattern, text)
print(match.group())  # 输出: <div>sometext</div> with <div>tags</div>

非贪婪匹配示例

pattern = r'<.*?>'
matches = re.findall(pattern, text)
print(matches)  # 输出: ['<div>', '</div>', '<div>', '</div>']

关键区别总结

模式表示方法匹配行为适用场景
贪婪*, +, ?, {}尽可能多匹配提取最大可能内容
非贪婪*?, +?, ??, {}?尽可能少匹配提取最小单位内容

综合应用建议

  1. 性能考虑​:对于频繁使用的正则表达式,使用re.compile()预编译可提高效率
  2. 错误处理​:总是检查匹配结果是否为None再调用group()
  3. 模式选择​:
    • 验证字符串格式→match
    • 查找内容→search
    • 提取所有匹配→findall
  4. 贪婪控制​:处理HTML/XML等嵌套结构时,非贪婪模式通常更安全

通过掌握这些核心函数和模式,您将能够高效处理大多数文本匹配和提取任务。正则表达式虽然复杂,但一旦掌握将成为您文本处理的强大武器。

7 或和组

或用|表示

组用(表达式)

5实战

读取html中的内容

import re
f1=open(r'D:\培训\中国城市名称大全.html','r',encoding='utf-8')
f2=open('城市大全.csv1','w')
ls=[]
for line in f1:# <div class="para" label-module="para">郑州市 洛阳市 焦作市 商丘市 信阳市 周口市 鹤壁市 安阳市 濮阳市 驻马店市</div>res=re.findall('<div class="para" label-module="para">(.+)</div>', line)if len(res)>0:ls = ls+res# print(re.findall("para>(.+)<", line))
for i in ls:f2.write(str(i)+',')# print(i)
f1.close()
f2.close()

二 第三方库 

第三方库,我们用一般用 pip在cmd终端安装,也可以在pycharm终端安装。

主要通过

 

 我们还可以在后面加

-i https://pypi.tuna.tsinghua.edu.cn/simple

来使用清华源的镜像源来安装

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

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

相关文章

使用球体模型模拟相机成像:地面与天空的可见性判断与纹理映射

在传统相机模拟中&#xff0c;地面通常被建模为一个平面&#xff08;Plane&#xff09;&#xff0c;这在低空场景下是合理的。但在更大视场范围或远距观察时&#xff0c;地球的曲率不可忽视。因此&#xff0c;我们需要将地面模型从平面升级为球体&#xff0c;并基于球面与光线的…

Agent自动化与代码智能

核心问题&#xff1a; 现在很多团队做AI系统有个大毛病&#xff1a;只顾追求“高大上”的新技术&#xff08;尤其是AI Agent&#xff09;&#xff0c;不管实际业务需不需要。 结果系统搞得又贵、又复杂、还容易出错。大家被“Agent”这个概念搞晕了&#xff1a;到底啥时候用简单…

SQL141 试卷完成数同比2020年的增长率及排名变化

SQL141 试卷完成数同比2020年的增长率及排名变化 withtemp as (selectexam_id,tag,date(submit_time) as submit_timefromexamination_infoleft join exam_record using (exam_id)wheresubmit_time is not null),2021_temp as (selecttag,count(*) as exam_cnt_21,rank() over…

C语言<数据结构-单链表>

链表是一种常见且重要的数据结构&#xff0c;在 C 语言中&#xff0c;它通过指针将一系列的节点连接起来&#xff0c;每个节点可以存储不同类型的数据。相比数组&#xff0c;链表在插入和删除元素时不需要移动大量数据&#xff0c;具有更好的灵活性&#xff0c;尤其适合处理动态…

archive/tar: unknown file mode ?rwxr-xr-x

这个是我在docker build报错的&#xff0c;这是一个node.js项目。我猜你也是一个node.js下的项目&#xff0c;或者前端项目。 解决方法&#xff1a; .dockerignore里面写一下node_modules就行了。 未能解决&#xff1a;archive/tar&#xff1a;未知文件模式&#xff1f;rwxr-…

【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库

文章目录背景界面当前支持的 Markdown 语法不支持的Markdown 语法代码节选背景 出于兴趣,我使用js实现了一个 markdown语法 -> ast语法树 -> html富文本的库, 其速度应当慢于正则实现的同类js库, 但是语法扩展性更好, 嵌套列表处理起来更方便. 界面 基于此js实现vue组…

【echarts踩坑记录】为什么第二个Y轴最大值不整洁

目录问题复现示意图&#xff1a;解决方法有以下几种&#xff1a;1. 在y轴配置中手动设置max属性&#xff1a;2. 使用ECharts提供的坐标轴标签格式化功能&#xff1a;&#x1f680;写在最后问题复现示意图&#xff1a; 今天在用echarts图表的时候&#xff0c;出现了一个小问题。…

Duplicate cleaner pro 的使用技巧

Duplicate cleaner pro 的使用技巧前言文件去重基本介绍经验之谈目录结构修改盘符起因方法手动分配方法‌数据修改方法安装sqlite-web修改数据库GPU加速安装驱动获取驱动和硬件信息安装CUDA配置环境变量&#xff08;如果是自定义安装&#xff09;创建程序<1>获取参数和命…

数字孪生技术引领UI前端设计新趋势:增强现实与虚拟现实的融合应用

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;AR 与 VR 的 “割裂” 与数字孪生的 “融合” 契机增强现实&#xff08;AR&…

Qt使用dump文件记录并查找软件奔溃信息详细教程

Qt使用dump文件记录并查找软件奔溃信息一、dump文件概述1、dump文件的基本概念2、dump文件的常见类型3、dump文件的分析工具4、dump文件的应用场景二、具体实现步骤1、下载dbghelp库2、将库添加到自己的工程中3、main.cpp添加代码记录奔溃日志4、编写测试代码5、测试6、结果查看…

UI前端与数字孪生结合案例分享:智慧城市的智慧能源管理系统

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;能源管理的 “数字孪生革命”智慧城市的能源系统正面临 “供需失衡、损耗…

Android 16系统源码_SplashScreen窗口的创建流程(一)

一 点击桌面图标触发SplashScreen 1.1 点击桌面图标打开应用 点击桌面的短信图标&#xff0c;然后打开短信页面&#xff0c;使用winscope获取数据。从点击短信图标到应用内容完全展开&#xff0c;中间有出现一个标题带有“Splash Screen”字符串的窗口。 二 Splash Screen窗口创…

线性代数学习笔记

矩阵 矩阵是一种非常重要的数学对象,它通常由一个由数字排成的矩形阵列来定义。一个矩阵由若干行和若干列组成,被称为矩阵的行数和列数。一般情况下,矩阵的行数和列数分别用 n n n 和 m m m 表示。<

2025.7.13总结

每次写日记&#xff0c;总觉得自我感受不是很好&#xff0c;脑子总会有许多消极思想。在网上&#xff0c;我曾看到一个关于“人生是一场巨大的事与愿违”&#xff0c;可能&#xff0c;真的是这个样子吧。以前的我&#xff0c;有上进心&#xff0c;有目标感&#xff0c;脚踏实地…

linux-网络-网络管理发展历程

Linux 的网络管理机制经历了多个阶段的发展&#xff0c;从早期的静态配置到现代动态管理工具的出现&#xff0c;反映了 Linux 系统在网络连接、自动化和用户体验方面的不断演进。以下是 Linux 网络管理发展的主要阶段&#xff1a;1. 早期的静态网络配置&#xff08;传统方式&am…

华为 GaussDB :技术特性、应用局限与市场争议

3-5月间&#xff0c;老夫在某学校带了这门课&#xff0c;简单总结一下课程外的看法&#xff1a;华为 GaussDB 作为华为云生态中的核心数据库产品&#xff0c;自推出以来便承载着华为在数据基础设施领域的战略野心。其技术路线既延续了开源数据库的兼容性优势&#xff0c;又深度…

从零开始学习深度学习—水果分类之PyQt5App

一、项目背景⭐&#xff1a;本项目是“从零开始学习深度学习”系列中的第二个实战项目&#xff0c;旨在实现第一个简易App(图像分类任务——水果分类)&#xff0c;进一步地落地AI模型应用&#xff0c;帮助初学者初步了解模型落地。基于PyQt5图形界面的水果图像分类系统&#xf…

小架构step系列13:测试用例的加载

1 概述测试用例的编写要有一些基础的规范&#xff0c;在本文先定义文件名称和测试用例方法名的规范。2 文件加载原理先从源码来看一下测试用例的文件加载原理。2.1 文件的匹配主要是通过注解来扫描测试用例。// 在IDEA测试用例启动时&#xff0c;调用junit-platform-launcher-x…

K8S的CNI之calico插件升级至3.30.2

前言宿主机ping不通K8S的pod&#xff0c;一直存在丢包的现象&#xff0c;排查了防火墙、日志、详细信息等没发现什么问题&#xff0c;最后搜索发现&#xff0c;是因为把K8S的版本升级之后&#xff0c;旧版本的CNI插件不适配原因导致的&#xff0c;于是就把calico也一并升级并且…

Spring Boot RESTful API 设计指南:查询接口规范与最佳实践

Spring Boot RESTful API 设计指南&#xff1a;查询接口规范与最佳实践 引言 在 Spring Boot 开发中&#xff0c;查询接口的设计直接影响着系统的可用性、可维护性和性能。本文将深入探讨如何规范设计查询接口&#xff0c;包括 GET/POST 的选择、参数定义、校验规则等&#xff…