Python入门【动态添加属性和方法、正则表达式概述、match函数的使用、常用匹配符、限定符 、限定符使用示例】(二十九)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

目录

动态添加属性和方法

__slots__ 的作用

正则表达式概述

match函数的使用

正则表达式修饰符

常用匹配符

限定符 

限定符使用示例


动态添加属性和方法

动态编程语言是高级程序设计语言的一个类别,在计算机科学领域 已被广泛应用。

它是指在运行时可以改变其结构的语言 :例如新的函数、 对象、甚至代码可以被引进, 已有的函数可以被删除或是其他结构上的变化。 

运行过程中给对象、类添加属性和方法

#coding=utf-8
import types
class Person():def __init__(self,namexiao,agetong):self.namexiao= namexiaoself.agetong= agetong
p1 = Person("zhangsan",20)
p2 = Person("lisi",30)
#动态给对象添加属性和方法
p1.score = 100
print(p1.score)
def run(self):print(f"{self.namexiao},running...")#动态的对象添加方法
p1.run = types.MethodType(run,p1)
p1.run()

types.MethonType的使用

p1.run = types.MethodType(run,p1)
# 即使换成
xxx = types.MethodType(run,p1)
# xxx()调用一样还用
# 因为之前提示缺少参数,主要是不知道self到底是谁,
# 而types.MethodType(run,p1)则是告诉解释器,self指的就是p1

给类动态添加静态方法以及类方法

@staticmethod
def staticfunc():print("---static method---")
Person.staticfunc = staticfunc
Person.staticfunc()
@classmethod
def clsfunc(cls):print('---cls method---')
Person.clsfunc = clsfunc
Person.clsfunc()

__slots__ 的作用

1、 __slots__ 对动态添加成员变量、成员方法有限制。对动态添加类属性、类方法没有限制。

2、 __slots__ 只对本类有限制,不限制子类

class Person():__slots__ = {"namexiao","agetong"}def __init__(self,namexiao,agetong):self.namexiao= namexiaoself.agetong= agetongdef eat(self):print("人是铁饭是钢,要吃!")
if __name__ == '__main__':p1 = Person("wang",18)
#   p1.gender = "man" #AttributeError: 'Person' object has no attribute 'gender'

正则表达式概述

概念 

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑 (可以用来做检索,截取或者替换操作)。

 作用

1、给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。

2、可以通过正则表达式,从字符串中获取我们想要的特定部分。

3、还可以对目标字符串进行替换操作。

基本函数 

Python语言通过标准库中的re模块支持正则表达式。re模块提供了一些根据正则表达式进行查找、替换、分隔字符串的函数, 这些函数使用一个正则表达式作为第一个参数。

函数描述
match(pattern,string,flags=0)根据pattern从string的头部开始匹配字符串,只返回第1次匹配成功的对象;否则,返回None
findall(pattern,string,flags=0)根据pattern在string中匹配字符串。如果匹配成功, 返回包含匹配结果的列表;否则,返回空列表。当 pattern中有分组时,返回包含多个元组的列表,每个元组对应1个分组。flags表示规则选项,规则选项用于辅助匹配。
sub(pattern,repl,string,count=0)根据指定的正则表达式,替换源字符串中的子串。 pattern是一个正则表达式,repl是用于替换的字符串,string是源字符串。如果count等于0,则返回 string中匹配的所有结果;如果count大于0,则返回 前count个匹配结果
subn(pattern,repl,string,count=0)作用和sub()相同,返回一个二元的元组。第1个元素是替换结果,第2个元素是替换的次数
search(pattern,string,flags=0)根据pattern在string中匹配字符串,只返回第1次匹配成功的对象。如果匹配失败,返回None
compile(pattern,flags=0)编译正则表达式pattern,返回1个pattern的对象
split(pattern,string,maxsplit=0)根据pattern分隔string,maxsplit表示最大的分隔数
escape(pattern)匹配字符串中的特殊字符,如*、+、?

match函数的使用

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。语法格式如下:

re.match(pattern, string, flags=0)
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。如下表列出正则表达式修饰符 - 可选标志

正则表达式修饰符

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

意义: 

1、re.match是用来进行正则匹配检查的方法,如果字符串开头的0个或多个字符匹配正则表达式 模式,则返回相应的match对象。如果字符串不匹配模式,返回None(注意不是空字符串"")

2、匹配对象Match Object具有group()方法, 用来返回字符串的匹配部分,具有span()方法。返回 匹配字符串的位置(元组存储开始,结束位置),具有start(),end()方法,存储匹配数据的开始和结束位置。(也可以通过对象的dir(对象查看对象的方法))

注意: 如果想在目标字符串的任意位置查找,需要使用search 

【示例】match方法的使用 

import re
xiaos='hello python'
patterntong='hello'
v=re.match(patterntong,xiaos)
print(v)
print(v.group())
print(v.span())

【示例】match方法中flag可选标志的使用

import re
xiaos = 'hello Python!'
tongm=re.match('hello python',xiaos ,re.I)  #忽略大小写
if tongm is not None:print('匹配成功结果是:',tongm .group())
else:print('匹配失败')

常用匹配符

一个正则表达式是由字母、数字和特殊字符(括号、星号、问号等)组成。正则表达式中有许多特殊的字符,这些特殊字符是构成正则表达式的要素。 

【示例】常用匹配符.的使用

import re
pattern='.' #匹配任意一个字符(除了\n)
sxiao='a'
print('匹配字符a:',re.match(pattern,sxiao))
sxiao='C'
print('匹配字符C:',re.match(pattern,sxiao))
sxiao='_'
print('匹配字符_:',re.match(pattern,sxiao))
sxiao='\n'
print('匹配字符\\n:',re.match(pattern,sxiao))

 【示例】常用匹配符\d的使用

import re
pattern='\d'  #匹配数字,即0-9
sxiao='9'
print('匹配数字9:',re.match(pattern,sxiao))
sxiao='4'
print('匹配数字4:',re.match(pattern,sxiao))
sxiao='a'
print('匹配字符a:',re.match(pattern,sxiao))
sxiao='_'
print('匹配字符_:',re.match(pattern,sxiao))

【示例】常用匹配符\D的使用

import re
pattern='\D' #匹配非数字的字符
sxiao='9'
print('匹配数字9:',re.match(pattern,sxiao))
sxiao='4'
print('匹配数字4:',re.match(pattern,sxiao))
sxiao='a'
print('匹配字符a:',re.match(pattern,sxiao))
sxiao='_'
print('匹配数字_:',re.match(pattern,sxiao))

【示例】常用匹配符\s的使用

import re
pattern='\s' #匹配空白字符,即空格(\n,\t)
sxiao=' '
print('匹配字符' ':',re.match(pattern,sxiao))
sxiao='\t'
print('匹配字符\\t:',re.match(pattern,sxiao))
sxiao='\n'
print('匹配字符\\n:',re.match(pattern,sxiao))
sxiao='_'
print('匹配字符_:',re.match(pattern,sxiao))

【示例】常用匹配符\S的使用

import re
pattern='\S' #匹配不是空白的字符
sxiao=' '
print('匹配字符' ':',re.match(pattern,sxiao))
sxiao='\t'
print('匹配字符\\t:',re.match(pattern,sxiao))
sxiao='\n'
print('匹配字符\\n:',re.match(pattern,sxiao))
sxiao='_'
print('匹配字符_:',re.match(pattern,sxiao))

【示例】常用匹配符\w和\W的使用

import re
print('-------\w匹配字母、数字、下划线--------')
pattern='\w' #匹配字母、数字、下划线
sxiao='a'
print('匹配字符a:',re.match(pattern,sxiao))
sxiao='_'
print('匹配字符_:',re.match(pattern,sxiao))
sxiao='5'
print('匹配数字5:',re.match(pattern,sxiao))
sxiao='A'
print('匹配字符A:',re.match(pattern,sxiao))
sxiao='#'
print('匹配字符#:',re.match(pattern,sxiao))
print('-------\W匹配不是字母、数字、下划线--------')
pattern='\W' #匹配不是字母、数字、下划线
sxiao='a'
print('匹配字符a:',re.match(pattern,sxiao))
sxiao='_'
print('匹配字符_:',re.match(pattern,sxiao))
sxiao='5'
print('匹配数字5:',re.match(pattern,sxiao))
sxiao='A'
print('匹配字符A:',re.match(pattern,sxiao))
sxiao='#'
print('匹配字符#:',re.match(pattern,sxiao))

【示例】[]匹配列表中的字符

import re
pattern='[2468]' #匹配列表中的字符
sxiao='1'
print('匹配数字1:',re.match(pattern,sxiao))
sxiao='2'
print('匹配数字2:',re.match(pattern,sxiao))
sxiao='3'
print('匹配数字3:',re.match(pattern,sxiao))
sxiao='4'
print('匹配数字4:',re.match(pattern,sxiao))
sxiao='#'
print('匹配字符#:',re.match(pattern,sxiao))
print('---------手机号码-----------')
sxiao='13456788789'
pattern='\d\d\d\d\d\d\d\d\d\d\d'#匹配手机号
print('匹配手机号码:',re.match(pattern,sxiao))
pattern='1[35789]\d\d\d\d\d\d\d\d\d'#匹配手机号
print('匹配手机号码:',re.match(pattern,sxiao))

其中,匹配符“[]”可以指定一个范围,例如:“[ok]”将匹配包含“o”或 “k”的字符。同时“[]”可以与\w、\s、\d等标记等价。例如,[0-9a-zAZ]等价于\w,[ ^0-9 ] 等价于\D。

限定符 

从上面示例中可以看到如果要匹配手机号码,需要形如 “\d\d\d\d\d\d\d\d\d\d\d”这样的正则表达式。其中表现了11次 “\d”,表达方式烦琐。正则表达式作为一门小型的语言,还提供了对表达式的一部分进行重复处理的功能。例如,“*”可以对正则表达式的某个部分重复匹配多次。这种匹配符号称为限定符。

符号描述符号描述
*匹配零次或多次{m}重复m次
+匹配一次或多次{m,n}重复m到n次,其中n可以省略,表示m到任意次
?匹配一次或零次{m,}至少m次

【示例】限定符*+?的使用

import re
print('------*匹配零次或多次--------')
pattern='\d*'  #0次或多次
sxiao='123abc'
print('匹配123abc:',re.match(pattern,sxiao))sxiao='abc'  #这时候不是None而是''
print('匹配abc:',re.match(pattern,sxiao))
print('-----+匹配一次或多次---------')pattern='\d+'  #1次或多次
sxiao='123abc'
print('匹配123abc:',re.match(pattern,sxiao))sxiao='abc'  #这时候是None
print('匹配abc:',re.match(pattern,sxiao))
print('-----?匹配一次或零次---------')pattern='\d?'  #0次或1次
sxiao='123abc'
print('匹配123abc:',re.match(pattern,sxiao))sxiao='abc'  #这时候是空
print('匹配abc:',re.match(pattern,sxiao))

【示例】限定符{}的使用

import re
print('-----{m}重复m次---------')
pattern='\d{3}'  #出现m次
sxiao='123abc'
print('pattern为\\d{3}匹配123abc结果:',re.match(pattern,sxiao))
pattern='\d{4}'  #出现m次
print('pattern为\\d{4}匹配123abc结果:',re.match(pattern,sxiao))
print('-----{m,}至少m次---------')sxiao='1234567abc'
pattern='\d{3,}'  #出现大于m次 尽可能满足的都返回
print('pattern为\\d{3,}匹配1234567abc结果:\n',re.match(pattern,sxiao))
print('-----{m,n}重复m到n次---------')
pattern='\d{2,4}'  #出现m到n次
print('pattern为\\d{2,4}匹配1234567abc结果:\n',re.match(pattern,sxiao))

限定符使用示例

【示例】匹配出一个字符串首字母为大写字符,后边都是小写字符,这些小写字母可有可无

pattern='[A-Z][a-z]*'
sxiao='Hello world'
sxiao='HEllo world'
v=re.match(pattern,sxiao)
print(v)

 【示例】匹配出有效的变量名

import re
pattern='[A-Za-z_][0-9A-Za-z_]*'
print('pattern为[A-Za-z_][0-9A-Za-z_]*')
sxiao='a'
print('匹配变量名a的结果:',re.match(pattern,sxiao))sxiao='ab'
print('匹配变量名ab的结果:',re.match(pattern,sxiao))sxiao='_ab'
print('匹配变量名_ab的结果:',re.match(pattern,sxiao))sxiao='2ab'
print('匹配变量名2ab的结果:',re.match(pattern,sxiao))print('pattern为[A-Za-z_]\w*')
pattern='[A-Za-z_]\w*'
sxiao='a'
print('匹配变量名a的结果:',re.match(pattern,sxiao))sxiao='ab'
print('匹配变量名ab的结果:',re.match(pattern,sxiao))sxiao='_ab'
print('匹配变量名_ab的结果:',re.match(pattern,sxiao))sxiao='2ab'
print('匹配变量名2ab的结果:',re.match(pattern,sxiao))

【示例】匹配出1-99之间的数字

import re
pattern='[1-9]\d?'
sxiao='1'
print('匹配数字1:',re.match(pattern,sxiao))sxiao='55'
print('匹配数字55:',re.match(pattern,sxiao))sxiao='99'
print('匹配数字99:',re.match(pattern,sxiao))sxiao='199'
print('匹配数字199:',re.match(pattern,sxiao))

【示例】匹配出一个随机密码8-20位以内 (大写字母 小写字母 下划线 数字)

import re
pattern='\w{8,20}'
sxiao='12345678'
print('匹配12345678的结果:\n',re.match(pattern,sxiao))sxiao='123__456'
print('匹配123__456的结果:\n',re.match(pattern,sxiao))

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

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

相关文章

SQL-每日一题【1321. 餐馆营业额变化增长】

题目 表: Customer 你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。 计算以 7 天(某日期 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。 结果按 …

深入理解Spring事务机制

Spring事务机制 一:故事背景二:核心知识2.1 Spring事务种类2.2.1 编程式事务2.2.2 声明式事务 2.2 Spring事务隔离级别2.3 Spring事务传播机制2.3.1 概念2.3.2 七种事务传播机制 2.4 Spring声明式事务实现原理2.4.1 Bean初始化创建代理对象2.4.2 执行目标…

Hlang社区-社区导航栏实现

文章目录 前言项目结构导航实现创作中心移动小球消息提示完整代码前言 okey,这里的话是我们社区导航栏的实现: 废话不多说,看看效果: 我甚至为此用New Bing生成了一个Logo。 项目结构 废话不多说,先来看到我们的项目结构: 在这里导航栏是一个组件。 在App.vue里面直…

【git clone error:no matching key exchange method found】

拉起项目代码报错 git clone ssh://uidxxxgerrit-xxxxxxxx Cloning into ‘xxxxx’… Unable to negotiate with xxx.xx.xxx.ip port xxxxx: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 fatal: Could not …

报道|新鲜出炉!INFORMS公布六位新任期刊主编

推文作者:徐思坤 编者按 INFORMS旗下的六本期刊,Management Science、Operations Research、Service Science、Tutorials in OR、INFORMS Analytics Collection,以及Transportation Science的新任主编公布,并将于2024年1月1日正式…

【内网监控】通过cpolar实现远程监控

【内网监控】通过cpolar实现远程监控 文章目录 【内网监控】通过cpolar实现远程监控前言1. 在cpolar官网预留一个空白隧道2. 完成空白数据隧道,生成地址3. 设置空白隧道的出口4. 空白数据隧道的出口设置5. 获取公网地址6. 打开本地电脑“远程桌面”7. 打开Windows自…

编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战

什么是 AOP AOP 是指通过预编译方式和运行期动态代理的方式,在不修改源代码的情况下对程序进行功能增强的一种技术。AOP 不是面向对象编程(OOP)的替代品,而是 OOP 的补充和扩展。它是一个新的维度,用来表达横切问题&a…

iptables防火墙(SNAT与DNAT)

目录 1 SNAT 1.1 SNAT原理与应用 1.2 SNAT工作原理 1.3 SNAT转换前提条件 2 SNAT示例 ​编辑 2.1 网关服务器配置 2.1.1 网关服务器配置网卡 2.1.2 开启SNAT命令 2.2 内网服务器端配置 2.3 外网服务器端配置 2.4 网卡服务器端添加规则 2.5 SNAT 测试 3 DNAT 3.1 网卡…

Android Framework 全局替换系统字体

基于Android 11 Android Framework 全局替换系统字体 第一种通过替换系统默认字体 将需要替换的字体资源放置frameworks/base/data/fonts/目录下。 将系统默认的Roboto字体替换为HarmonyOs字体。 frameworks/base/data/fonts/fonts.xml frameworks/base/data/fonts/Android.…

隧道HTTP优化程序示例

作为专业爬虫程序员,我们经常需要使用代理服务器处理大量的请求。但是,单一服务器往往无法承担高并发请求和HTTPS加密的压力,这时候我们可以利用CDN来优化性能,并实现反向代理和HTTPS加速。下面,让我们一步步来了解。 …

倒计时动效

1. 效果 2. html <div class"count"><span>3</span><span>2</span><span>1</span> </div>3. css body {width: 100vw;height: 100vh;overflow: hidden;display: flex;justify-content: center;align-items: cente…

利用console提高写bug的效率

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 自从入坑前端后&#xff0c;日常写bug就没离开过console。 要说用得多&#xff0c;不如说是console.log用得多&#xff0c;console.warn和console.erro…

【高光谱图像的去噪算法】通过全变异最小化对受激拉曼光谱图像进行去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32--ADC模数转换

文章目录 ADC简介逐次逼近型ADCADC框图转换模式数据对齐转换时间校准ADC基本结构ADC单通道工程代码&#xff1a; ADC简介 STM32的ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器&#xff0c;是一种逐次逼近型模拟数字转换器&#xff0c;可以将引脚上连续…

Docker容器:docker基础概述、安装、网络及资源控制

文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.…

百华劳保|听厂家聊聊如何检测防水劳保鞋?

说起防水劳保鞋大家可能并不陌生&#xff0c;在有积水或水利工程这些工作场景中使用&#xff0c;是防止水渗透鞋子的安全防护鞋。许多企业会为员工发放防水劳保鞋&#xff0c;在采购时一般都需要进行防水测试&#xff0c;提供相对应的检测报告。今天百华小编与大家聊聊都是如何…

vue3+ts-tsconfig.json报错Option ‘importsNotUsedAsValues’

vue3ts-tsconfig.json报错Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption ‘“ignoreDeprecations”: “5.0”’ to silence this error. Use ‘verbatimModuleSyntax’ instead 自我记录 翻译 选项…

OpenGL —— 1、Vs2017搭建glad、glfw环境,并附代码测试

GLFW 简介           GLFW是一个开源的多平台库&#xff0c;用于OpenGL&#xff0c;OpenGL ES和 桌面上的 Vulkan 开发。它提供了一个简单的 API 来创建 窗口、上下文和表面&#xff0c;接收输入和事件。 GLFW是用C语言编写的&#xff0c;支持Windows&#xff0c;mac…

音视频FAQ(三):音画不同步

摘要 本文介绍了音画不同步问题的五个因素&#xff1a;编码和封装阶段、网络传输阶段、播放器中的处理阶段、源内容产生的问题以及转码和编辑。针对这些因素&#xff0c;提出了相应的解决方案&#xff0c;如使用标准化工具、选择强大的传输协议、自适应缓冲等。此外&#xff0…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由请求时&#xff0c;出现如下错误 yml配置如下&#xff1a; 可能的一种原因是&#xff1a;yml配置了gateway.discovery.locator.enabledtrue&#xff0c;此时gateway会使用负载均衡模式路由请求&#xff0c;但是SpringCloud Alibaba删除了Ribbon的…