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

news2025/1/12 18:20:25

👏作者简介:大家好,我是爱敲代码的小王,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= namexiao
        self.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= namexiao
        self.agetong= agetong
    def 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.coloradmin.cn/o/897435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAS:1450754-37-6,Alkyne Diazirine acid,炔烃双吖丙啶羧酸

今日文章关键词:炔烃双吖丙啶羧酸供应商,药物靶标识别,CAS:1450754-37-6 产品简介:Alkyne-Diazirine-COOH,可用于药物靶标识别,一般优势体现在反应活性高,位阻小,稳定性…

普陀发布新规服务元宇宙企业 和数软件发展元宇宙场景落地

近日,数智中国AIGC科技周2023全球元宇宙大会上海站活动现场“半马苏河”元宇宙企业科创政策包正式发布。政策包在普陀原有科创政策基础上进行了叠加升级,一共涵盖了十条专项服务元宇宙企业的专项政策,简称普陀“元十条”。 普陀“元十条”从…

新研究表明,自我注意层可以取代视觉任务中的卷积层

近年来,人工智能在自然语言处理(NLP)领域经历了更大的发展或突破——而“变形金刚”是这场革命背后的不那么秘密的新技术。转换器与传统方法(如递归神经网络或卷积神经网络)之间的主要区别在于,转换器可以同…

回归预测 | MATLAB实现SSA-BP麻雀搜索算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-BP麻雀搜索算法优化BP神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现SSA-BP麻雀搜索算法优化BP神经网络多输入单输出回归预测(多指标,多图)效果一览基本…

使用git rebase 之后的如何恢复到原始状态

我们常常喜欢使用git rebase去切换分支提交代码,操作流程就是: 先切换分支:比如当前是master 我们修改了一堆代码产生一个commit id :5555555567777 那么我们常常比较懒就直接切换了:git checkout dev 然后呢?使用命令git rebase 5555555567777,想把这笔修改提交到d…

改进YOLO系列:4.添加ACmix注意力机制

添加ACmix注意力机制 1. ACmix注意力机制论文2. ACmix注意力机制原理3. ACmix注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. ACmix注意力机制论文 论文题目:On the Integration of Self-Attention and Convolution 论文链接:On the Integration…

kubesphere 使用流水线对接 sonar

官方文档:使用图形编辑面板创建流水线 创建凭证 创建 sonar 凭证 创建 gitlab 凭证 创建流水线 创建流水线,编辑流水线 自定义流水线 拉取代码 代理选 kubernetes,label 填maven 添加步骤 - git 填写 git 地址,选…

微服务中间件-分布式缓存Redis

分布式缓存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 两者对比 b.Redis主从1) 搭建主从架构2) 数据同步原理(全量同步)3) 数据同步原理(增量同步) c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

MobaXterm网络远程工具介绍下载安装破解使用

一、介绍 obaXterm 是远程计算机的工具箱。在单个 Windows 应用程序中,它提供了大量为程序员、网站管理员、IT 管理员量身定制的功能。 MobaXterm 为 Windows 桌面提供了重要的远程网络工具(SSH、X11、RDP、VNC、FTP、MOSH 等)和Unix 命令&a…

Linux0.11内核源码解析-truncate.c

truncate文件只要实现释放指定i节点在设备上占用的所有逻辑块,包括直接块、一次间接块、二次间接块。从而将文件节点对应的文件长度截为0,并释放占用的设备空间。 索引节点的逻辑块连接方式 释放一次间接块 static void free_ind(int dev,int block) {…

【计算机视觉|生成对抗】逐步增长的生成对抗网络(GAN)以提升质量、稳定性和变化

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Progressive Growing of GANs for Improved Quality, Stability, and Variation 链接:[1710.10196] Progressive Growing of GANs for Improved Quality, Stability, and Vari…

算法与数据结构(七)--堆

一.堆 1.堆的定义 堆是计算机科学中一类特殊的数据结构的通常,堆通常可以被看做是一颗完全二叉树的数组对象。 堆的特性 1.它是完全二叉树,除了树的最后一层结点不需要是满的,其他的每一层从左到右都是满的,如果最后一层结点不…

Java-仓库管理系统

1. 引言 该文档旨在定义并描述一个仓库管理系统的功能和特性,系统使用MySQL数据库,并采用SpringBootVue的前后端分离开发模式。本文档将涵盖系统的主要功能、用户权限管理、数据结构和交互流程。 2. 功能需求 2.1. 用户管理 系统应该支持用户注册和登…

msvcp140.dll丢失怎样修复?msvcp140.dll重新安装的解决方法

msvcp140.dll是Windows操作系统中的一个重要的动态链接库文件,它包含了许多C标准库函数的实现。当系统中缺少或损坏了msvcp140.dll文件时,可能会导致一些应用程序无法正常运行。下面将介绍几种详细的解决方法,以帮助您解决msvcp140.dll丢失的…

Lnton羚通关于如何使用nanoPC-T4 安装OpenCV?

nanoPC-T4 安装 OpenCV Note: OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation. Please download the latest FriendlyCore/FriendlyDesktop Image file from the following URL: http://do…

OpenMV与STM32串口通信 (OpenMV、K210、视觉模块 与 STM32单片机、51单片机串口通信,Python与C语言串口通信)

文章目录 Python端编码单片机端解码完整代码 2023/08/18 Python端编码 在Python端,我们想通过串口发送整型或浮点型数据时,可以借助struct.pack对需要发送的数据进行打包,简单来说,当调用这个函数时,设备会将需要发送…

java基础知识学习笔记

1、参考链接 Java 教程 | 菜鸟教程Java 教程 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统。 本教程通过简单的实例将让大家更好的了解 Java 编程语言。 移动操…

微人事项目在线聊天(一)

项目首页增加聊天入口 添加一个消息按钮 Home.vue <el-header class"header"><h3 class"title">微人事</h3><div><el-button icon"el-icon-bell" type"text" style"margin-right: 8px;color: #0000…

centos如何查找某一命令对应的安装包

需求背景 有时候在容器里搭建了一个开发环境&#xff0c;需要有些命令能在容器里也能用&#xff0c;但是有时候只知道命令&#xff0c;但是不知道这个命令对应的是哪个安装包提供&#xff0c;比如最简单的命令 ip命令&#xff0c;"ip a"可以查看主机的所有ip信息&am…

Android应用架构-MVVM模式

前言 随着Android应用开发技术的不断发展和成熟&#xff0c;很开发者越来越关注着Android应用架构的设计。目前&#xff0c;Android的应用架构主要有MVC、MVP和MVVM模式&#xff0c;我们就来说一下MVVM模式。 MVP模式 MVVM模式可以说是MVP模式的进一步发展&#xff0c;所以先…