Day16-re模块和全局变量
一 、re模块
1.re.compile(正则表达式)
根据正则表达式创建一个正则表达式对象。
re_obj = re.compile('\d{3}')
print(re_obj.fullmatch('123'))
2.re.fullmatch(正则表达式, 字符串)
获取字符串和正则表达式完全匹配的结果, 匹配失败返回None, 匹配成功返回匹配对象。
result = re.fullmatch('(\d{3})-([a-z]{2})', '987-sz')
print(result)
- 获取匹配到的字符串
匹配对象.group() – 获取整个正则表达式匹配到的结果。
匹配对象.group(N) – 获取表达式中第N个分组匹配到的结果(前提是正则表达式必须有分组)。
print(result.group()) # 987-sz
print(result.group(1)) # 987
print(result.group(2)) # sz
- 获取匹配结果在原字符串中的位置信息,返回开始下标和结束下标。
print(result.span()) # (0,6)
print(result.span(2)) # (4,6)
- 获取原字符串。
print(result.string)
3.re.match(正则表达式, 字符串)
将字符串的开头和正则表达式匹配。
re_str = r'\d{3}'
print(re.fullmatch(re_str, '987'))
print(re.match(re_str, '547gfhdhdg'))
4.re.search(正则表达式, 字符串)
在字符串中查找第一个满足正则表达式的子串 , 如果没有找到返回None,找到了返回匹配对象。
print(re.search(re_str, 'dfhsdg654ggfgj'))
5. re.findall(正则表达式, 字符串)
获取字符串中所有满足正则表达式的子串 , 返回值是列表,列表中的元素是满足正则的子串。
如果正则有一个分组,如果有两个以上的分组,只返回括号里的。
print(re.findall(re_str, 'gsdg987hdhd123sgshsh789'))
print(re.findall(r'\d{2}-[A-Z]{2}', '是噶23-AH规范化和电话57-HJ'))
print(re.findall(r'(\d{2})-[A-Z]{2}', '是噶23-AH规范化和电话57-HJ'))
print(re.findall(r'(\d{2})-([A-Z]{2})', '是噶23-AH规范化和电话57-HJ'))
6. re.finditer(正则表达式, 字符串)
获取字符窜中所有满足正则的子串 , 返回值是一个序列,序列中的元素是匹配的对象。
result = re.finditer(r'(\d{2})-([A-Z]{2})', '是噶23-AH规范化和电话57-HJ')
for x in result:
print(x.group())
7.re.sub(正则表达式, 字符串1,字符串2)
将字符串2 中所有满足正则表达式的子串替换成字符串1
str2 = '施工23方离开5648的含放大后返回3'
result = re.sub(r'\d+', '+', str2)
print(result)
# 练习:王者荣耀脏话屏蔽功能
sentence = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
result = re.sub(r'(?!)傻\s*(叉|b|B|瓜)f\s*u\s*c\s*k|操|sb', '*', sentence)
print(result)
8.re.split(正则表达式, 字符串)
sentence = '噶1规范a 暖g风机h是是过j分的c话'
result = re.split(r'[a-z]', sentence)
print(result)
二、忽略大小写和单行匹配
1.忽略大小写
# 方法一:在正则表达式的最前面加(?!)
print(re.fullmatch(r'(?!)123[a-z]', '456A'))
# 方法二:flags=re.I
print(re.fullmatch(r'123[a-z]', '123k', flags=re.I))
2. 单行匹配
'''
多行匹配的时候:.不能匹配换行
单行匹配的时候:.可以匹配换行
方法一:在正则表达式的最前面加(?s)
方法二:flags = re.S
'''
print(re.fullmatch(r'123.abc', '123\nabc')) # None
print(re.fullmatch(r'(?s)123.abc', '123\nabc')) # <re.Match object; span=(0, 7), match='123\nabc'>
print(re.fullmatch(r'123.abc', '123\nabc', flags=re.S))
# 既忽略大小写又单行匹配
print(re.fullmatch(r'(?is)123.abc', '123\nabc'))
print(re.fullmatch(r'123.abc', '123\nabc', flags=re.S|re.I))
三、认识类和对象
1. 什么是类什么是对象
类:就是拥有相同属性和相同功能的对象的集合(抽象的)
对象:就是类的实例(类的具体表现)
如果电脑是类,我桌上的这台电脑就是对象
如果车是类,楼下那辆奔驰就是对象
2.定义类(用代码描述这个类有哪些相同属性和哪些相同功能的对象的集合)
语法:
class 类名:
类的说明文档
类的内容
说明:
class - 关键字;固定写法
类名 - 自己命名,不能是关键字,是标识符。规范:单词首字母大写,见名知义
类的说明文档 – 注释
类的内容 – 主要包含类的属性和方法(方法的本质就是函数)
属性分为:类属性(字段)和对象属性
方法分为:对象/实例方法、类方法和静态方法
3. 创建对象
语法:
对象=类()
class Student:
'''学生类'''
pass
stu1 = Student()
print(stu1)
4.方法:对象方法、类方法和静态方法
- 对象方法
定义:直接定义在类中的函数就是对象方法
怎么调用:要通过对象来调用 – 对象.方法名()
特点:自带参数self ,而且参数self在调用的时候不需要传参,系统会自动将当前对象传给self
就是谁调用,self就指向谁
class Person:
# eat 就是对象方法
def eat(self):
print(self)
print('吃饭')
# sleep是对象方法
def sleep(self):
print('睡觉')
p = Person()
print(p) # self 和p 是一样的
p.eat() # eat(p)
5.初始化方法
python的类中有一个特殊的对象方法:__init__这个方法在通过类创建对象的时候被自动调用
魔法方法:方法名以__开头并且__结尾,所有的魔法方法都不需要程序员调用,系统自动调用
(1)创建对象的时候会自动调用类中的__init__方法
(2)创建对象1时候需不需要参数,需要几个参数,由类中的__init__方法决定
class Dog:
def __init__(self):
print('init被调用')
dog1 = Dog()
dog2 = Dog()
class Cat:
def __init__(self, name):
print('猫init', name)
cat1 = Cat('小花') #创建对象的时候需不需要参数,由init的形参决定
6. 属性
类中的数据信息就是属性,动作信息就是方法, 属性分为类属性(字段)和对象属性。
- 类属性
怎么定义:直接定义在类中的变量就是类属性
怎么使用:通过类使用 - 类.类属性
什么时候用:属性值不会因为对象不同而不一样(属性值一样) 例如圆的圆周率
- 对象属性
怎么定义:以self.属性名 = 值的形式定义在类中的__init__方法里面
怎么使用:通过对象使用 对象.属性
什么时候用:属性值会因为对象不同而不一样,就定义成对象属性
class Person:
a = 10 # a 是类属性
def __init__(self):
self.name = '小明' # 每次创建对象的时候,name的都是小明,创建的时候不可改变
self.age = 18 # name age 就是对象属性
print(Person.a) # 使用类属性
p1 = Person()
print(p1.name, p1.age) # 使用对象属性
class Student:
def __init__(self, n, tel1='110'):
self.name = n # 每次创建对象的时候都必须给name属性赋值
self.study_id = '000' # 每次创建对象的时候,study_id的都是000,创建的时候不可改
self.tel = tel1 # 每次创建对象的时候可以选择性的给tel属性赋值或者不赋值
# 练习:定义一个矩形类,拥有属性:长和宽 ,拥有方法:计算周长和面积
class Rect:
def __init__(self, long1=10, wide1=10):
self.long = long1
self.wide = wide1
def area(self):
s = self.long * self.wide
print(f'面积{s}')
def perimeter(self):
print(f'周长{(self.long+self.wide)*2}')
r1 = Rect(10, 100)
r1.perimeter()