python自学之《21天学通Python》(10)——正则表达式

news/2024/4/19 5:29:39/文章来源:https://blog.csdn.net/yin1331102028yin/article/details/128666488

第13章 正则表达式

最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。

程序员所用的正则表达式是指用某种模式去匹配一类具有共同特征的字符串。正则表达式主要用于处理文本,正则表达式能够使文本处理简单起来,尤其对于复杂的查找替换这样的工作,使用正则表达式会非常快的完成。流行的文本编辑器(如Emacs、Vim等)大都支持正则表达式。

13.1 正则表达式基础

维基百科所言:正则表达式又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或re),是计算机科学的一个概念。本节详细介绍了正则的概念和应用。

13.1.1 正则表达式概述

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由UNIX中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

正则表达式主要用于快速地搜索、替换或验证具有特殊形式或格式的文本,可以应用于文本编辑、查找,也可以应用于web数据处理与分析等领域。

13.1.2 正则表达式基本元字符

元字符是正则表达式中具有特定含义的字符,在正则表达式中可以在字符串中使用元字符来匹配字符串的各种可能的情况。常用的元字符如表13.1所示。

![在这里插入图片描述](https://img-blog.csdnimg.cn/46ada904d706494ba53253042420b65f.png#pic_center)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

>>> import re
>>> re.compile('\\ba.?')
re.compile('\\ba.?')
>>> re.compile(r'\ba.?')
re.compile('\\ba.?')
>>> re.compile('\\\\word')
re.compile('\\\\word')
>>> re.compile(r'\\word')
re.compile('\\\\word')
>>> 

注意 正则表达式的元字符有很多,只有经常用它,才能熟练识记。

13.1.3 常用正则表达式
在这里插入图片描述

注意以上只是处理以13开头的手机号码,随着手机号码的不断推出,现在还有14、15、不18开头的手机号。这里为了简化正则表达式,使初学者能看懂,暂不处理其他号段的情况。

在这里插入图片描述
在这里插入图片描述
13.2 re模块

re模块是Python语言提供的处理正则表达式的标准库,在该模块中,既可以直接匹配正则表达式的基本函数,也可以通过编译正则表达式对象,并使用其方法来使用正则表达式。

13.2.1 正则匹配搜索函数
在这里插入图片描述
在这里插入图片描述
注意 区分match()函数和search()函数的功能,一个只能从第一个字符开始匹配,一个可以从要匹配的字符串的中间任一个字符进行匹配。
在这里插入图片描述
在这里插入图片描述

>>> import re
>>> s = 'Life can be good'
>>> print(re.match ('can',s))
None
>>> print(re.search('can',s))
<re.Match object; span=(5, 8), match='can'>
>>> print(re.match('1.*',s))
None
>>> print(re.match('1. *', s, re.I))
None
>>> re.findall('[a-z]{3}', s)
['ife', 'can', 'goo']
>>> re.findall('[a-z]{1,3}',s)
['ife', 'can', 'be', 'goo', 'd']
>>> 

13.2.2 sub()与subn()函数
在这里插入图片描述
在这里插入图片描述

>>> import re
>>> s = 'Life can be bad'
>>> re.sub('bad', 'good', s)
'Life can be good'
>>> re.sub('bad|be', 'good', s)
'Life can good good'
>>> re.sub('bad|be', 'good', s, 1)
'Life can good bad'
>>> re.subn('bad|be', 'good', s, 1)
('Life can good bad', 1)
>>> r = re.subn('bad|be', 'good', s)
>>> print(r[0])
Life can good good
>>> print(r[1])
2
>>> 

13.2.3 split()函数
re.split()函数用于分割字符串,它返回分割后的字符串列表。其函数原型分别如下。
在这里插入图片描述
注意 该函数返回的数据类型为列表。
在这里插入图片描述
在这里插入图片描述
13.2.4 正则表达式对象这部分演示了,但是没有保存下来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
13.3 分组匹配与匹配对象使用

在正则表达式中使用组,可以将正则表达式分解成几个不同的组成部分。在完成匹配或者搜索后,可以使用分组编号访问不同部分匹配的内容。

13.3.1 分组基础

在正则表达式中以一对圆括号“()”来表示位于其中的内容属于一个分组。例如“(re)+”将匹配“rere”、“rerere”等多个“re”重复的情况。分组在匹配由不同部分组成的一个整体时非常有用。如电话号码由区号和号码组成,在正则表达式中可以使用两个分组来进行匹配:一个分组匹配区号,另一个分组匹配后边的号码。在交互式环境下演示代码如下:

在这里插入图片描述
在这里插入图片描述
13.3.2 分组扩展

除了在组中使用“(?P<组名>)”来命名组名以外,还可以使用几种以“?”开头的扩展语法,如表13.3所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

>>> import re
>>> s = '''Life can be good;
... Life can be bad;
... Life is mostly cheerful;
... But sometimes sad.
... '''
>>> r = re.compile(r'be(?=\sgood)')
>>> m = r.search(s)
>>> m
<re.Match object; span=(9, 11), match='be'>
>>> m.span()
(9, 11)
>>> r.findall(s)
['be']
>>> r = re.compile('be')
>>> r.findall(s)
['be', 'be']
>>> r = re.compile(r'be(?!\sgood)')
>>> m = r.search(s)
>>> m
<re.Match object; span=(27, 29), match='be'>
>>> m.span()
(27, 29)
>>> r = re.compile(r'(?:can\s) be (\sgood)')
>>> m = r.search(s)
>>> m
>>> m.groups()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> r = re.compile(r'(?:can\s)be(\sgood)')
>>> m = r.search(s)
>>> m
<re.Match object; span=(5, 16), match='can be good'>
>>> m.groups()
(' good',)
>>> m.groups(1)
(' good',)
>>> r = re.compile(r'(?P<first>\w)(?P=first)')
>>> r.findall(s)
['o', 'e']
>>> r = re.compile(r'(?<=can\s)b\w*\b')
>>> r.findall(s)
['be', 'be']
>>> r = re.compile(r'(?<!can\s)(?i)b\w*\b')
<stdin>:1: DeprecationWarning: Flags not at the start of the expression '(?<!can\\s)(?i)b\\w*\\b'
>>> r = re.compile(r'(?<!can\s)(?i)b\w*\b')
>>> r.findall(s)
['bad', 'But']
>>> 

13.3.3 匹配对象与组的使用

Match对象实例是由正则表达式对象的match、search方法在匹配成功后返回的。Match对象有以下常用的方法和属性,用于对匹配成功的正则表达式进行处理。

group()、groups()、groupdict()方法都是处理在正则表达式中使用“()”分组的情况。不同的是,group()的返回值为字符串,当传递多个参数时其返回值为元组;groups()的返回值为元组;groupdict()的返回值为字典。其原型分别如下:

group( [group1, …])
groups( [default])
groupdict( [default])

对于group(),其参数为分组的编号。如果向group()传递多个参数,则其返回各个参数所对应的字符串组成元组。对于groups()和groupdict()一般不需要向其传递参数。

在这里插入图片描述
在这里插入图片描述

>>> s = '''Life can be dreams,
... Life can be great thoughts;
... Life can mean a person,
... Sitting in a court.'''
>>> r = re.compile('\\b(?P<first>\w+)a(\w+)\\b')
>>> m = r.search(s)
>>> m.groupdict()
{'first': 'c'}
>>> m.groups()
('c', 'n')
>>> m.groupdict()
{'first': 'c'}
>>> m = r.search(s,9)
>>> m.group()
'dreams'
>>> m.group(1)
'dre'
>>> m.group(2)
'ms'
>>> m.group(1,2)
('dre', 'ms')
>>> m.groupdict()
{'first': 'dre'}
>>> m.groups()
('dre', 'ms')
>>> 

13.3.4 匹配对象与索引使用

start()、end()、span()方法返回所匹配的子字符串的索引。其原型分别如下:

start( [groupid=0])
end( [groupid=0])
span( [groupid=0])

其参数含义相同,groupid为可选参数,即分组编号。如果不向其传递参数,则返回整个子字符串的索引。start()方法返回子字符串或者组的起始位置索引。end()方法返回子字符串或者组的结束位置索引。而span()方法则以元组的形式返回以上两者。

在这里插入图片描述
在这里插入图片描述

>>> r = re.compile('\\b(?P<first>\w+)a(\w+)\\b')
>>> m = r.search(s,9)
>>> m.start()
12
>>> m.start(1)
12
>>> m.start(2)
16
>>> m.end(1)
15
>>> m.end()
18
>>> m.span()
(12, 18)
>>> m.span(2)
(16, 18)
>>> 

13.4 正则表达式应用示例

正则表达式是处理文本文件的强有力工具。本节中给出一个简单地使用正则表达式处理Python程序中的函数和变量的例子。

在Python程序中,函数定义必须以“def”开头,因此处理函数的过程相当简单。为了代码简洁,此处假设程序编写规范上在关键字“def”后跟一个空格,然后就是函数名,接着就是参数。没有考虑使用多个空格的情况。

而Python程序中的变量不好处理,因为变量一般不需要事先声明,往往都是直接赋值。因此在程序中首先处理了变量直接赋值的情况。通过匹配单词后接“=”的情况查找变量名。同样,为了代码简洁,仅考虑比较规范整洁的写法,变量名与“=”之间有一空格。另外,还有一类变量是在for循环语句中直接使用的,因此程序中又特别处理了for循环的情况。为了使代码简洁,程序并没有处理变量名重复的情况。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

>>> import re
>>> import sys
>>> def DealWithFunc(s):
...     r = re.compile(r'''
...             (?<=def\s)
...             \w+
...             \(.*?\)
...             (?=:)
...             ''',re.x|re.U
...     return r.findall(s)File "<stdin>", line 8return r.findall(s)^
SyntaxError: invalid syntax
>>> def DealWithFunc(s):
...     r = re.compile(r'''
...             (?<=def\s)
...             \w+
...             \(.*?\)
...             (?=:)
...             ''',re.x|re.U)
...     return r.findall(s)
... 
>>> def DealWithVar(s):
...     vars = []
...     r = re.compile(r'''
...         \b
...         \w+
...         (?=\s=)
...         ''',re.x|re.U)
...     vars.extend(r.findall(s))
...     r = re.compile(r'''
...         (?<=for\s)
...         \w+
...         \s
...         (?=in)
...         ''',re.X|re.U
...     vars.extend()
KeyboardInterrupt
>>> def DealWithFunc(s):
...     r = re.compile(r'''
...         (?<=def\s)
...         \w+
...         \(.*?\)
...         (?=:)
...         ''',re.X|re.U)
...     return r.findall(s)
... 
>>> def DealWithVar(s):
...     vars = []
...     r = re.compile(r'''
...         \b
...         \w+
...         (?=\s=)
...         ''',re.X|re.U
...         )
... 
>>> def DealWithVar(s):
...     vars = []
...     r = re.compile(r'''
...         \b
...         \w+
...         (?=\s=)
...         ''',re.X|re.U)
...     vars.extend(r.findall(s))
...     r = re.compile(r'''
...         (?<=for\s)
...         \w+
...         \s
...         (?=in)
...         ''',re.X|re.U)
...     vars.extend(r.findall(s))
...     return vars
... 
>>> if len(sys.argv) == 1:
...     sour = input("请输入要处理的文件路径")
... 
请输入要处理的文件路径
>>> else:File "<stdin>", line 1else:^
SyntaxError: invalid syntax
>>> if len(sys.argv) == 1:
...     sour = input("请输入要处理的文件路径")
... else:
...     sour = sys.argv[1]
... 
请输入要处理的文件路径
>>> file = open(sour,encoding="utf-8")
Traceback (most recent call last):File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: ''
>>> if len(sys.argv) == 1:
...     sour = sys.argv[1]
... else:
... 
KeyboardInterrupt
>>> if len(sys.argv) == 1:
...     sour = input("请输入要处理的文件路径")
... else:
...     sour = sys.argv[1]
... 

13.5 小结

正则表达式的功能非常强大,学习难度也较大,本章以尽量多的操作代码演示了正则表达式的用法。首先介绍了正则表达式的基本元字符、常用正则表达式分析。接着介绍了使用Python的re模块处理正则表达式,如用match函数进行搜索、使用sub函数进行内容替换、使用split函数分割等。接着介绍了将正则表达式编译为对象,以提供更高性能的方法。还介绍了正则表达式中的分组、匹配和搜索的结果对象——Match对象的使用等内容。以后要多编写代码进行学习、验证。在其他程序设计语言中也可以直接使用在这里学习的正则表达式。

13.6 本章习题
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

机器学习调参

机器学习调参常用调参方法举例K邻近算法&#xff08;最常规版本&#xff09;加入交叉验证加上网格搜索GridSearchCV函数介绍GridSearchCVcross_val_score常用调参方法举例 sklearn使得我们在很多编写代码的时候更多的工作倾向于调参数而不是去写算法本身&#xff0c;本篇文章整…

卸载Node.js

0 写在前面 无论您是因为什么原因要卸载Node.js都必须要卸载干净。 请阅读&#xff1a; 1 卸载步骤 1.1通过控制面板卸载node.js winR—>control.exe—>卸载程序—>卸载Node.js 等待—>卸载成功 1.2 删除安装时的nodejs文件夹 通过记忆或者Everthing搜索找…

「自控元件及线路」14 电子电力技术与功率放大器概述

本节介绍电子电力技术的基本概念 本节介绍PD、SCR、GTR、MOSFET、IGBT等电子电力器件 本节介绍功率放大器的基本概念和线性功率放大器 文章目录电力电子技术概述电能变换电子电力器件功率二极管PD晶闸管SCR功率晶体管GTR功率场效应晶体管PowerMOSFET绝缘栅双极晶体管IGBT功率放…

使用 ThreeJS 实现第一个三维场景(详)

文章目录参考描述index.html三维场景的基本实现导入 ThreeJS准备工作场景摄像机视锥体正交摄像机透视摄像机渲染器后续处理将摄像机添加至场景中移动摄像机设置画布尺寸将渲染器创建的画布添加到 HTML 元素中渲染物体结构材质合成将物体添加至场景中代码总汇执行效果动画reques…

你的自动化框架如何设计的?为什么感觉面试官总是不满意,到底问题出在哪?

前言去面试自动化测试岗位&#xff0c;尤其是接口自动化岗位&#xff0c;面试官总会问&#xff1a;说下你的自动化框架如何设计的&#xff1f;为什么回答后&#xff0c;面试官对你的框架设计总是感觉不满意&#xff1f;自动化测试实现的几种方式对于不同的公司来说&#xff0c;…

2023年地方两会政府工作报告汇总(各省市23年重点工作)

新年伊始&#xff0c;全国各地两会密集召开&#xff0c;各省、市、自治区2023年政府工作报告相继出炉&#xff0c;各地经济增长预期目标均已明确。相较于2022年&#xff0c;多地经济增长目标放缓&#xff0c;经济不断向“高质量”发展优化转型。今年是二十大后的开局之年&#…

【参加CUDA线上训练营】零基础cuda,一文认识cuda基本概念

【参加CUDA线上训练营】零基础cuda,一文认识cuda基本概念1.术语2.线程层次2.1 Block、Warp与Thread之间的关系2.2 Thread index1.术语 \\%序号名称描述1HostCPU和内存&#xff08;host memory&#xff09;2DeviceGPU和显存&#xff08;device memory&#xff09;3SMStreaming M…

101-并发编程详解(上篇)

并发编程详解在学习之前&#xff0c;如果多线程的理解足够&#xff0c;可以往下学习&#xff0c;否则的话&#xff0c;建议先看看26章博客&#xff08;只是建议&#xff09;&#xff0c;注意&#xff1a;可能有些字的字体不对&#xff0c;那么一般是复制粘贴来的&#xff0c;但…

开关电源-一种方便快捷计算开关电源环路参数的方法及实例

一种方便快捷计算开关电源环路参数的方法及实例 接上文《技术实例 | 开关电源环路测量时&#xff0c;注入信号的幅值对测量结果的影响》&#xff0c;得到电流环功率级的开环传递函数后&#xff0c;我们通过matlab的sisotool工具箱自动计算出了电流环路补偿器的传递函数C&#…

三层交换机【实验】

目录 1、要求&#xff1a; 2、拓扑&#xff1a; 3、创建vlan和端口定义并划入vlan&#xff1a; 4、创建以太网中继Eth-Trunk使sw1和sw2的相互冗余并且不浪费链路&#xff1a; 5、使用mstp定义组和对应的根&#xff1a; 6、配置网关冗余&#xff1a; 7、核心层的路由的IP配…

云仓仓储的运行模式是什么?

仓库能够简单地定义为一个规划空间&#xff0c;通常是一个用于处置和贮存货物的大型商业建筑。因而&#xff0c;仓储是指在这样一个规划空间中存储和处置货物所触及的一切过程。仓库中常见的货物包括&#xff1a;;机械零配件、建筑资料、废品农产品、家具和电子产品。仓库中的一…

Fluid-数据缓存亲和性调度原理解析

前言在Fluid中&#xff0c;Dataset资源对象中所定义的远程文件是可被调度的&#xff0c;这意味着你能够像管理你的Pod一样管理远程文件缓存在Kubernetes集群上的存放位置。另外&#xff0c;Fluid同样支持对于应用的数据缓存亲和性调度&#xff0c;这种调度方式将应用(e.g. 数据…

二进制部署K8S集群

目录 一、架构图 二、部署步骤 1、实验环境 2、操作系统初始化配置 3、部署 docker引擎 4、部署 etcd 集群 5、部署 Master 组件 一、架构图 二、部署步骤 1、实验环境 服务器类型IP地址master192.168.80.5node01192.168.80.8node02192.168.80.9 2、操作系统初始化配置…

SpringBoot整合Mybatis的核心原理

0. 前言&#xff1a;1. 自动配置类MybatisAutoConfiguration&#xff1a;1.1. SqlSessionFactory的生成&#xff1a;1.2. Mapper的扫描和代理生成&#xff1a;1.2.1. MapperScannerConfigurer1.2.2. MapperFactoryBean1.2.3. getMapper生成代理对象2. 小结&#xff1a;0. 前言&…

3D模型深度生成网络【ShapeAssembly】

推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 我们提出了一个深度生成模型&#xff0c;该模型学习在ShapeAssembly中编写新颖的程序&#xff0c;ShapeAssembly是一种用于建模3D形状结构的特定领域语言。 执行 ShapeAssembly 程序会生成一个由部件代理长方体的分层连…

2023,考个软考中级证书稳妥深圳入户,5月考试8月办入户

最新消息&#xff01;最新消息&#xff01;最新消息&#xff01; 2023年2月8日&#xff0c;深圳市发展和改革委员会深圳市公安局深圳市人力资源和社会保障局关于印发《深圳市积分入户办法》的最新通知↓ 来源《深圳市发展和改革委员会》 该积分入户将于2023年2月15日正式实施&…

Prometheus监控Java-JMX

一、什么是 JMX Exporter ? JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的一些监控数据&#xff0c;然后将其转换为 Prometheus 所认知的 metrics 格式&#xff0c;以便让 Prometheus 对其进行监控采集。 那么&#xff0c;JMX 又是什么呢&#xff1f;它的全称是&a…

ChatGPT 支持的搜索引擎 Bing 究竟什么样?

微软于2月8日北京时间凌晨在 Redmond 线下举办一场媒体活动&#xff0c;围绕微软的产品以及 AI&#xff0c;公布最新消息。这里我们先回顾一下微软在 AI 上的布局。 2019年&#xff0c;微软向 OpenAI 投资10亿美元&#xff0c;成为了 OpenAI 紧密的合作伙伴&#xff0c;而微软…

Java中动态调用setter以及getter

0x00 前言 对于非专业程序员的安全人员来说&#xff0c;因为没有代码项目的积累&#xff0c;很多知识体系都不完善&#xff0c;所以有必要在一些常用的内容进行学习的总结。 在很多的调用链中都会用到**“动态调用setter以及getter”**这个知识点&#xff0c;比如经典的CB链&a…

Python语言零基础入门教程(九)

Python pass 语句 Python pass 是空语句&#xff0c;是为了保持程序结构的完整性。 pass 不做任何事情&#xff0c;一般用做占位语句。 Python 语言 pass 语句语法格式如下&#xff1a; pass测试实例&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 Pytho…