当前位置: 首页 > news >正文

Day24 正则表达式 正则函数 正则命名分组 正则表达式修饰符号

1.正则表达式函数

1.1findall 匹配字符串中相应内容,返回列表 [用法: findall("正则表达式","要匹配的字符串")]

finditer 匹配字符串中相应内容,返回迭代器

# finditer 匹配字符串中相应内容,返回迭代器
# finditer 和 findall 用法一样,区别在于返回的是迭代器
# 迭代器里面是一个一个的对象,想获取对象的值用 group()
strvar = "sdfsdff&*&*%^%234sdfsdfskdjfk3sdf23"
lst = re.findall(r"\d",strvar)
print(lst)
# ['2', '3', '4', '3', '2', '3']
res = re.finditer(r"\d",strvar)
print(res)
# <callable_iterator object at 0x00000000027C7EB8>
from collections import Iterator
print(isinstance(res,Iterator))
# True
it = re.finditer(r"\d",strvar)
obj = next(it)
res = obj.group()
print(res)
# 2
for i in it:
    res = i.group()
    print(res)
# 3
# 4
# 3
# 2
# 3

 

1.2search   通过正则匹配出第一个对象返回,通过group取出对象中的值

match   验证用户输入内容

 

# (1)search   通过正则匹配出第一个对象返回,通过group取出对象中的值
strvar = "1d2 3&5"
obj = re.search(r"(\d).*?(\d)",strvar)
print(obj)
print(obj.group())

# 拿到分组当中的值用groups
res = obj.groups()
print(res)
# ('1', '2')
# 拿到分组里的元素个数 lastindex
res = obj.lastindex
print(res)
# 2
# search 和 match 用法一样,区别在与match在正则的前面加了一个^ [必须以..开头]
# search 只需要在正则的前面加上^ 就可以取代match
strvar = "uuyydfopopopop3434sdf234"
# obj = re.search("^d.*?\d",strvar) #c 等价于match
obj = re.search(r"d.*?\d",strvar)
res = obj.group()
print(res,"<search>")
# \d 是匹单个的数字字符
# dfopopopop3 <search>
# match
obj = re.match(r"d.*?\d", strvar)
print(obj)
# 对比search而言match相当于内部添加了^符号,意思是必须以某个字符开头
# 所以上面的没有结果

1.3split   切割

# 2)split    切割
strvar = "alex|wusir|secret,boy"
# 传统做法
lst = strvar.replace(",","|").split("|")
print(lst)
# ['alex', 'wusir', 'secret', 'boy']
# 但是对于符号过多的表达式就不能够切割了
strvar = "alex,wusir|secret%boy"
res = re.split(r"[,|%]",strvar)
print(res)
# ['alex', 'wusir', 'secret', 'boy']
# 可以选择分割次数
res = re.split(r"[,|%]",strvar,1)
print(res)
# ['alex', 'wusir|secret%boy']

strvar = "alex234234wusir2secret909090boy"
res = re.split(r"\d+",strvar)
print(res)
# ['alex', 'wusir', 'secret', 'boy']
# 分析得到如果想要得到alex,wusir,secret,boy,只有以数字就行切割就好了

1.4sub     替换

#sub      替换 
strvar = "alex,wusir|secret%boy"
res = re.sub("[,|%]","-",strvar)
print(res)
# alex-wusir-secret-boy
# 后面可以选择替换次数
res = re.sub(r"[|%,]", "_",strvar,1)
print(res)
# alex_wusir|secret%boy
# subn 与 sub 用法一样,最大的区别在于返回值 ,返回一个元组,包含替换的次数
res = re.subn(r"[|,%]","_",strvar)
print(res)
# ('alex_wusir_secret_boy', 3)

1.5compile 指定一个统一的匹配规则

# (5)compile 之的是一个统一的匹配规则

"""
写一套正则,程序就需要重新编译一次,
同一个正则多处使用,反复编译会浪费时间
这样的话,就可以使用compile 来定义一次,终身受益
"""
rule = re.compile(r"\d+")
print(rule)
# re.compile('\\d+')
strvar = "sdfsdfs234kjkjk*(*9343dsf3"
obj = rule.search(strvar)
print(obj)
# <_sre.SRE_Match object; span=(7, 10), match='234'>
print(obj.group())
# 234

lst = rule.findall(strvar)
print(lst)
# ['234', '9343', '3']

 

2.正则表达式修饰符

# (6) 正则表达式的修饰符
'''
re.I 使匹配对大小写不敏感
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
'''
# re.I 使匹配对大小写不敏感
strvar = "<h1>sdfsfsdfsd</H1>"
# rule = re.compile("<h1>.*?</h1>")
# 推荐使用flags来指定修饰符,预防未知错误
rule = re.compile("<h1>.*?</h1>",flags=re.I)
obj = rule.search(strvar)
print(obj)
# <_sre.SRE_Match object; span=(0, 19), match='<h1>sdfsfsdfsd</H1>'>
print(obj.group())
# <h1>sdfsfsdfsd</H1>
# 这样子写的话,可以匹配到前面"<h1>.*?</h1>" 没有包括后面h是大写的这种情况,
# 使用compile时候可以让表达式能匹配到后面带有大写的这种情况


# re.M 多行匹配,影响 ^ 和 $
"""
# 每一行都单独的去匹配,卡主开头和结尾,忽略换行. 每一行都拿出来单独匹配
"<h1>sdfsf</h1>"
"<h1>dd22</h1>"
"<h1>aabb</h1>"
"""

strvar = """<h1>sdfsf</h1>
<h1>dd22</h1>
<h1>aabb</h1>"""

rule = re.compile(r"^<h1>(.*?)</h1>$",flags=re.M)
lst = rule.findall(strvar)
print(lst)
# ['sdfsf', 'dd22', 'aabb']
print("<================>")
# re.S 使 . 匹配包括换行在内的所有字符
strvar = '''give
123mefive
'''
# 如果想要去匹配出give/n123mefive
rule = re.compile(r"(.*?)mefive",flags=re.S)
obj = rule.search(strvar)
print(obj.group())

# 其中的.*?是不能匹配换行符的,写了re.S之后,rule就可以匹配换行符。

 3.命名分组

# 2.命名分组
3) (?P<组名>正则表达式) 给这个组起一个名字
4) (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
'''
import re
strvar = "<h1>sdfsfsdfsdf</h1>"
lst = re.findall(r"<.*?>.*?<.*?>",strvar)
print(lst)
# ['<h1>sdfsfsdfsdf</h1>']
lst = re.findall(r"<(.*?)>.*?<(.*?)>", strvar)
print(lst)
# [('h1', '/h1')]
lst = re.findall(r"<(.*?)>(.*?)<(.*?)>",strvar)
print(lst)
# [('h1', 'sdfsfsdfsdf', '/h1')]
# 反向引用 拿已经匹配到的值,在引用一次 
# 引用第一个括号里面的内容 \1 
# 引用第二个括号里面的内容 \2 依次类推...
strvar = "123<h1>sdfsdfsdfsdf</h1>  123<h2>ppoo</h2>"
lst = re.findall(r"<(.*?)>(.*?)</\1>",strvar)
print(lst)
# [('h1', 'sdfsdfsdfsdf'), ('h2', 'ppoo')]
# 会将匹配到满足条件的放到一个算式里面


# 命名分组
strvar = "d3j5sdj"
obj = re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar)
print(obj)
# <_sre.SRE_Match object; span=(0, 7), match='d3j5sdj'>
res = obj.group()
print(res)
# d3j5sdj
# 用命名分组进行反向引用
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)",strvar)
print(obj)
res = obj.group()
print(res)
# <_sre.SRE_Match object; span=(0, 7), match='d3j5sdj'>
# d3j5sdj
# 第二种写法
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2", strvar)
print(obj)
res = obj.group()
print(res)
# <_sre.SRE_Match object; span=(0, 7), match='d3j5sdj'>
# d3j5sdj
# 注意格式的书写

 

4.类中的方法

# 类中的方法
'''
普通方法:没有参数,只能类调用
绑定方法:(1)绑定到对象(自动传递对象参数) (2)绑定到类(自动传递类参数)
静态方法:无论是类还是对象,都能调用的方法
'''
class Dog():
    def __init__(self,name):
        self.name = name
        
    # 普通方法
    def jiao():
        print("小狗看见人就旺旺")
        
    # 绑定到对象方法
    def tian(self):
        print("小狗喜欢舔")
    
    # 绑定到类方法
    @classmethod
    def la(cls):
        print(cls)
        print("小狗会吃屎")
        
    # 静态方法
    @staticmethod
    def jump():
        print("小狗喜欢跳起来接飞盘")

obj = Dog("迈克尔·蛋")

 

 

 

# (1) 普通方法

Dog.jiao() #小狗看见人就旺旺

 

 

 

# (2) 绑定到对象方法

 

obj.tian() #小狗喜欢舔
# Dog.tian(134)  # 如果硬要使用类来调用,满足实参形参一一对应. 

 

 

 

 


# (3) 绑定到类方法

Dog.la()

#<class '__main__.Dog'>

#小狗会吃屎

# 用对象调用绑定到类的方法是可以的,先找出该对象所归属的类是谁,然后在传递这个类
obj.la()
# 同上

 

# (4) 静态方法

obj.jump()
Dog.jump()

 

代码运行结果:

小狗喜欢跳起来接飞盘
小狗喜欢跳起来接飞盘

 

转载于:https://www.cnblogs.com/longerandergou/p/10932641.html

相关文章:

  • zookeeper原理浅析(二)
  • 自己出题
  • 关于字符串中含有中英文逗号,分号获取,判断并转换
  • 2019最新Python学习教程_Python学习路线:分支结构
  • codeforces 827B. High Load
  • mac 下iterm2终端安装rz sz 命令方法
  • 第二阶段团队冲刺2
  • CGContextRefCGMutablePathRefUIBezierPath简单学习
  • 实现底部top点击到顶部
  • [Operating System] {ud923} P4L4: Datacenter Technologies
  • 第十四周学习进度
  • 数据库实践
  • window安装vs报错
  • 线性表的链式存储结构——链表
  • autocare使用命令
  • JS 中的深拷贝与浅拷贝
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Git 使用集
  • java中具有继承关系的类及其对象初始化顺序
  • nodejs调试方法
  • node学习系列之简单文件上传
  • sessionStorage和localStorage
  • SpringBoot 实战 (三) | 配置文件详解
  • SQLServer之创建显式事务
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • v-if和v-for连用出现的问题
  • windows下mongoDB的环境配置
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 全栈开发——Linux
  • 手写双向链表LinkedList的几个常用功能
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Linux(Source Insight安装及工程建立)
  • $ git push -u origin master 推送到远程库出错
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)llvm ir转换过程
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (windows2012共享文件夹和防火墙设置
  • (zt)最盛行的警世狂言(爆笑)
  • (笔试题)分解质因式
  • (待修改)PyG安装步骤
  • (二)Linux——Linux常用指令
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)负载均衡,回话保持,cookie
  • .net 托管代码与非托管代码
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • /bin/rm: 参数列表过长"的解决办法
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @property @synthesize @dynamic 及相关属性作用探究
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——