import re
re_obj = re.compile(r'\d{3}')
re_obj.search('fsdjghj354gd')
re_obj.fullmatch('435')
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
re_str = r'\d{3}'
print(re.fullmatch(re_str, '435'))
print(re.match(re_str, '435fdhd冬天Vdfr3df'))
re.search(正则表达式, 字符串) - 查找在字符串中第一个满足正则的子串
如果没有找到,返回None,如果找到了返回匹配对象
print(re.search(re_str, 'hhet发生过e653fdgs255fdt'))
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')]
result = re.finditer(r'(\d{2})-([A-Z]{2})', '发给34-GF1Fdfe表情5645-EF;')
# print(list(result))
for i in result:
print(i.group())
str1 = 'gsg氛7围比较高发54gsh生地方4546好玩'
result1 = re.sub(r'\d+', '+', str1)
print(result1) # gsg氛+围比较高发+gsh生地方+好玩
str2 = 'fsda富商大贾grr3c56afdsg福建省第几bfhwc46y'
result2 = re.split(r'[abc]', str2)
print(result2) # ['fsd', '富商大贾grr3', '56', 'fdsg福建省第几', 'fhw', '46y']
import re
# 方法一:在正则表达式的最前面加(?i)
print(re.fullmatch(r'(?i)123[a-z]', '123F'))
# 方法二:在最后加一个flags=re.I
print(re.fullmatch(r'123[a-z]', '123Y', flags=re.I))
# 多行匹配的时候,.不能匹配换行(默认):
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)) #
什么是类什么是对象
类就是拥有相同属性和相同功能的对象的集合;对象就是类的实例(类的具体的表现)
定义类(用代码描述这个类是拥有哪些相同属性和哪些相同功能的对象的集合)
语法:
class 类名:
类的说明文档
类的内容
说明:
class - 关键字;固定写法
类名 - 程序员自己命名;要求:是标识符,不能是关键字;
规范:所有单词的首字母大写(驼峰式命名并且首字母大写);见名知意;不使用系统提供的名字
类的说明文档 - 三个双引号开头和结尾的注释
类的内容 - 主要包含类的属性和方法(方法本质是定义在类中的函数)
属性分为:类属性(字段)和对象属性
方法分为:对象方法(实例方法)、类方法和静态方法
class Student:
"""学生类"""
pass
语法:
对象 = 类()
stu1 = Student()
print(stu1)
stu2 = Student()
print(stu2)
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('小花')
怎么定义:直接定义在类中的变量就是类属性; 怎么使用:通过类使用 -> 类.类属性 什么时候用:属性值不会因为对象不同而不一样就定义为类属性
class Person:
a = 10 # a是类属性
b = 'abc' # b也是类属性
print(Person.a, Person.b) # 10 abc
Person.a = 100
print(Person.a * 2) # 200
怎么定义:以“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()