day16 - re模块以及面向对象

re模块

import re

  1. re.compile(正则表达式) - 根据正则表达式创建一个正则表达式对象
re_obj = re.compile(r'\d{3}')
re_obj.search('fsdjghj354gd')
re_obj.fullmatch('435')
  1. re.fullmatch(正则表达式, 字符串) - 获取字符串和正则表达式完全匹配的结果(看整个字符串是否满足正则的规则)
    # 如果匹配失败,返回None,如果匹配成功返回匹配对象
result = re.fullmatch(r'(\d{3})-([a-z]{2})', '897-yu')
print(result)

​ 1) 获取匹配到的字符串(重要)

​ 匹配对象.group() - 获取整个正则表达式匹配到的结果

​ 匹配对象.group(N) - 获取正则表达式中第N个分组匹配到的结果

print(result.group())     # 897-yu
print(result.group(1))    # 897
print(result.group(2))    # yu

​ 2) 获取匹配结果在原字符串中的位置信息(返回开始下标和结束下标,左闭右开区间)

print(result.span())     # (0, 6)
print(result.span(2))     # (4, 6),表示第二个分组对象在原字符串中的位置

​ 3) 获取原字符串

print(result.string)    # 897-yu
  1. re.match(正则表达式, 字符串) - 将字符串的开头和正则表达式匹配
    如果匹配失败,返回None,如果匹配成功返回匹配对象
re_str = r'\d{3}'
print(re.fullmatch(re_str, '435'))
print(re.match(re_str, '435fdhd冬天Vdfr3df'))
  1. re.search(正则表达式, 字符串) - 查找在字符串中第一个满足正则的子串

    如果没有找到,返回None,如果找到了返回匹配对象

print(re.search(re_str, 'hhet发生过e653fdgs255fdt'))
  1. re.findall(正则表达式, 字符串) - 获取字符串中所有满足正则的子串
    返回一个列表,列表中的元素是满足正则的子串;没有满足的返回的是一个空列表
print(re.findall(re_str, 'hhet发生过e653fdgs255fdt'))    # ['653', '255']
print(re.findall(r'\d{2}-[A-Z]{2}', '发给34-GF1Fdfe表情5645-EF;'))   # ['34-GF', '45-EF']
# 如果正则有一个分组:
print(re.findall(r'(\d{2})-[A-Z]{2}', '发给34-GF1Fdfe表情5645-EF;'))  # ['34', '45']
# 如果正则有两个分组:
print(re.findall(r'(\d{2})-([A-Z]{2})', '发给34-GF1Fdfe表情5645-EF;'))  # [('34', 'GF'), ('45', 'EF')]
  1. re.finditer(正则表达式, 字符串) - 获取字符串中所有满足正则的子串
    返回一个序列,序列中的元素是匹配对象
result = re.finditer(r'(\d{2})-([A-Z]{2})', '发给34-GF1Fdfe表情5645-EF;')
# print(list(result))
for i in result:
    print(i.group())
  1. re.sub(正则表达式, 字符串1, 字符串2) - 将字符串2中所有满足正则表达式的子串全部都替换成字符串1。
str1 = 'gsg氛7围比较高发54gsh生地方4546好玩'
result1 = re.sub(r'\d+', '+', str1)
print(result1)     # gsg氛+围比较高发+gsh生地方+好玩
  1. re.split(正则表达式, 字符串) - 将字符串中满足正则表达式的子串作为切割点进行切割
str2 = 'fsda富商大贾grr3c56afdsg福建省第几bfhwc46y'
result2 = re.split(r'[abc]', str2)
print(result2)   # ['fsd', '富商大贾grr3', '56', 'fdsg福建省第几', 'fhw', '46y']

忽略大小写和单行匹配

import re

  1. 忽略大小写
# 方法一:在正则表达式的最前面加(?i)
print(re.fullmatch(r'(?i)123[a-z]', '123F'))
# 方法二:在最后加一个flags=re.I
print(re.fullmatch(r'123[a-z]', '123Y', flags=re.I))
  1. 单行匹配
# 多行匹配的时候,.不能匹配换行(默认):
print(re.fullmatch(r'123.abc', '123\nabc'))   # None
# 单行匹配的时候,.可以匹配换行:
# 方法一:在正则表达式的最前面加(?s)
print(re.fullmatch(r'(?s)123.abc', '123\nabc'))   # 
# 方法二:在最后加一个flags=re.S
print(re.fullmatch(r'123.abc', '123\nabc', flags=re.S))   # 
# 既忽略大小写,又单行匹配:
# 方法一:在正则表达式的最前面加(?si)或者(?is)
print(re.fullmatch(r'(?is)123.abc', '123\nABc'))   # 
# 方法二:在最后加一个flags=re.S|re.I
print(re.fullmatch(r'123.abc', '123\nABc', flags=re.I|re.S))   # 

类和对象

  1. 什么是类什么是对象
    类就是拥有相同属性和相同功能的对象的集合;对象就是类的实例(类的具体的表现)

  2. 定义类(用代码描述这个类是拥有哪些相同属性和哪些相同功能的对象的集合)

语法:
class 类名:

​ 类的说明文档

​ 类的内容

说明:
class - 关键字;固定写法
类名 - 程序员自己命名;要求:是标识符,不能是关键字;
规范:所有单词的首字母大写(驼峰式命名并且首字母大写);见名知意;不使用系统提供的名字
类的说明文档 - 三个双引号开头和结尾的注释
类的内容 - 主要包含类的属性和方法(方法本质是定义在类中的函数)
属性分为:类属性(字段)和对象属性
方法分为:对象方法(实例方法)、类方法和静态方法

class Student:
    """学生类"""
    pass
  1. 创建对象

语法:
对象 = 类()

stu1 = Student()
print(stu1)
stu2 = Student()
print(stu2)
对象方法
  • 方法就是定义在类中的函数,分为三种:对象方法、类方法和静态方法
  1. 对象方法
    特点:自带参数self,而且参数self在调用的时候不需要传参,系统会自动将当前对象传给self(谁调用self就指向谁)
    # 定义:直接定义在类中的函数就是对象方法
class Person:
    def eat(self):       # eat就是对象方法
        print('吃饭')

    def sleep(self, time):     # sleep也是对象方法
        print(f'睡了{time}小时')

​ # 怎么调用:通过对象来调用 -> 对象.方法名()

p = Person()
p.eat()    # 吃饭
p.sleep(8)    # 睡了8小时

python的类中,有一个特殊的对象方法叫__init__,这个方法在通过类创建对象的时候会被自动调用。
# 补充:魔法方法:方法名以两个下划线开头并且以两个下划线结尾的都叫魔法方法,所有的魔法方法都不需要程序员去调用,系统会自动调用。
# 1)创建对象的时候会自动调用类中的__init__方法
# 2)创建对象的时候需要参数、需要几个参数由类中的__init__方法决定

class Dog:
    def __init__(self):
        print('init被调用')


dog1 = Dog()
dog2 = Dog()


class Cat:
    def __init__(self, name, age=3):
        print('猫的init', name, age)


cat1 = Cat(name='小咪', age=4)
cat2 = Cat('小花')
属性
  • 类中的数据信息就是属性,动作信息就是方法。
  • 属性分为类属性和对象属性。
  1. 类属性(字段)

怎么定义:直接定义在类中的变量就是类属性; 怎么使用:通过类使用 -> 类.类属性 什么时候用:属性值不会因为对象不同而不一样就定义为类属性

class Person:
    a = 10    # a是类属性
    b = 'abc'  # b也是类属性


print(Person.a, Person.b)    # 10 abc
Person.a = 100
print(Person.a * 2)     # 200
  1. 对象属性

怎么定义:以“self.属性名 = 值”的形式定义在类中的__init__方法里面 怎么使用:通过对象使用 -> 对象.属性 什么时候用:属性值会因为对象不同而不一样就定义成对象属性

class Person:
    a = 10
    b = 'abc'

    def __init__(self):
        self.name = '小明'    # name和age是对象属性
        self.age = 19


# 使用对象属性:
p1 = Person()
print(p1.name, p1.age)    # 小明 19
p1.name = '张三'
print(p1.name)     # 张三


# 给属性赋值的三种方法:
class Student:
    def __init__(self, name1, tel0='110'):
        self.name = name1  # 1.每次创建对象的时候都必须给name属性赋值
        self.study_id = '000'  # 2.每次创建学生对象的时候study_id的值都是'000',而且创建的时候不可以变
        self.tel = tel0   # 3.每次创建对象时可以选择性的给tel属性赋值或者不赋值

练习:定义一个矩形类,拥有属性:长和宽,拥有方法:计算周长和面积

class Rectangle:
    def __init__(self, length0, width0):
        self.length = length0
        self.width = width0

    def area(self):
        print(f'面积:{self.length * self.width}')

    def perimeter(self):
        print(f'周长:{(self.length + self.width) * 2}')


r1 = Rectangle(10, 20)
r1.area()
r1.perimeter()

你可能感兴趣的:(day16 - re模块以及面向对象)