继承和重写
一、继承:在Python中,是为了最大程度减少代码量
被继承的类叫做父类,基类,超类,继承的叫子类,衍生类,派生类
子类能继承父类的属性和方法,一个子类可以继承多个类,也可以间接继承。
隔壁老王是煎饼果子名人,他有一天干不动了,但是不想让手艺失传。
所以隔壁老王将手艺传给了大儿子王二麻子
class Father:
def __init__(self,name = '隔壁老王',kungfu = '《煎饼果子宝典》'):
self.name = name
self.kungfu=kungfu
def cook(self):
return f'{self.name}根据{self.kungfu}做出美味的煎饼果子'
F1 = Father()
print(F1.cook())
# 继承语法:类名后添加小括号,小括号中写被继承父类的类名
class Son(Father):
# 子类还可以拥有自己的属性,但子类一旦拥有了自己的属性,他将不再自动继承父类属性
def __init__(self,age):
#子类的超类的初始化属性
# super(Son,self).__init__()
#直接把父类属性拿过来,使用self传值
Father.__init__(self)
self.age = age
#子类虽然继承了父类,但是子类还可以拥有自己的方法
#王二麻子还想去学习新式煎饼果子.>>>>>学成归来
def newCook(self,book):
return f'{self.age}岁{self.name}学成归来{book}做出新的煎饼果子'
#重写父类的方法
def cook(self):
return f'{self.name}根据《煎饼果子宝典》和《新式煎饼果子》做出更哈吃的煎饼果子'
# 子类重写父类后还想在使用父类的方法
def oldCook(self):
return super(Son, self).cook()
s1 = Son(30)
s1.name = '王二麻子'
print(s1.cook())
print(s1.newCook('新的煎饼果子秘籍'))
print(s1.oldCook())
- 王二麻子将父亲的煎饼果子发扬光大,年纪轻轻月工资达到3200,走向人生巅峰
王二麻子退休后又想将自己一身技能传给儿子。 - 魔法方法: mro,使用__mro__能够看到子类继承的顺序,python中所有的类都有一个顶级类object
print(Son.__mro__)
正则表达式
- 正则表达式是使用一系列特殊符号从字符串中匹配内容
- 正则表达式是独立于所有语言的语法,所有语言中正则表达式的语法是相同的,只是使用方式不一样
- fullmatch(正则表达式,字符串): 判断字符串是否完全正则表达式规则,
成立返回一个对象,不成立返回空值None
二、匹配类符号
- 通配符: .(点) 可以匹配任意一个符号
re_str = 'a.b'
# str1 = 'abc'
str1 = 'a1b'
re.fullmatch(re_str,str1)
result1 = re.fullmatch(re_str,str1)
print(result1)
- \d:匹配0-9数字
- \D:匹配非数字
re_str = 'a\d\dc'
str2 = 'a12c'
result2 = re.fullmatch(re_str,str2)
print(result2)
- 普通符号:在正则表达式中没有特殊含义的符号
re_str = 'abcd'
str3 = 'abcd'
print(re.fullmatch(re_str, str3))
- \s:匹配空白符号(空格,\n,\t,\v等)
- \S:匹配非空白符号
# re_str = 'a\sb'
# str4 = 'a\nb'
re_str = 'a\Sb'
str4 = 'acb'
print(re.fullmatch(re_str, str4)
- \w:匹配数字,字母,下划线,朝鲜语。
- [字符集] - 从[]的字符集中匹配一个符号
- 常见的字符集
- 字符集规则:-连接的是范围,-左边必须小于右边的,-不能出现在字符集开头或结尾,不然表示-自己
re_str = '[a-zA-Z][a-zA-Z]'
str5 = 'az'
print(re.fullmatch(re_str, str5))
9.[^字符集]: 匹配不在字符集中的元素
- 字符集规则没有变,必须在字符集最开头添加^
re_str = '[^a-zA-Z][a-zA-Z][a-z^A-Z]'
str6 = '.z^'
print(re.fullmatch(re_str, str6))
- findall(正则表达式,字符串):方法一、从字符串中按照正则表达式的规则匹配所以可能,并将每一个结果放到列表中
- 方法二、 如果正则表达式中出现了分组,只会获取正则表达式结果中符合分组中规则的结果
str1 = 'a1b35677d45f6j7'
re_str = r'\d+'
print(re.findall(re_str, str1))
重复
import re
# 1. ?:匹配0次或者1次
re_str= 'a\d?'
str1 = 'a'
print(re.fullmatch(re_str, str1))
# 2. +:匹配一次或多次打印出来
str2 = 'a1b35677d45f6j7'
re_str= '[0-9]+'
print(re.findall(re_str, str2))
# 3. * :匹配任意次数
print(re.findall('a\d*',str2))
# 4. {M,N}
# {M}:匹配m次
# {N}匹配n次
# {M,N}最少m次,最多n次
# {M,}至少匹配m次,没有最多次
# {,N}最多匹配n次,最少匹配0次
str2 = 'a1b35677d45f6j7'
re_str= '[0-9]{1,}'
re_str = '\d{1,}'
print(re.findall(re_str, str2))
#贪婪和非贪婪
# 所有次数不确定的匹配都是贪婪的(一次性匹配更多的元素)
#非贪婪就是匹配取最短长度结果,在非贪婪涉及的符号的基础上添加一个?即可,比如+?,{,N}?,*?等
str3 = 'abcabcrbc'
re_str = 'a.+c'
print(re.findall(re_str, str3))
re_str = 'a.+?c'
print(re.findall(re_str, str3))
#hghjkae中i90b=oiuyghjv中的"ae中i9"取出来
str2 = 'hghjkae中i90b=oiuyghjv'
re_str = 'a.+9'
print(re.findall(re_str, str2))
分支和分组
import re
# 分支:|
str1 = 'abcabd'
# 匹配出“abc'和’abd'
re_str= '[a-z]{3}'
print(re.findall(re_str, str1))
# .通配符放到[]中,特殊意义消失
re_str = 'abc|abd'
print(re.findall(re_str,str1))
# 分组:()
#1.能过将同类项取出来
# 2.能够将分组中的结果重复
str1 = 'abcabd'
re_str = '(ab(c|d))'
print(re.findall(re_str,str1))
# str2 = '1234==12341235'
str2 = '1234==12341234'
re_str = r'(\d{4})(=)\2\1\1'
# 如果字符串后面再次出现过前面匹配过得结果,可以将前面的结果使用分组包围起来
# 结合\N(N是数字,代表第N个分组)的语法,可以”将前面第N个分组的结果“重复使用
print(re.fullmatch(re_str, str2))
# 正则表达式不是转义字符,在写正则表达式时,在正则表达式前面添加r或者R.
正则表达式的方法
- fullmatch\findall\split\sub\search\match
- fullnatch:查看整个字符串是否符合正则表达式 None
- findall:将字符串中所有符合正则表达式的规则的结果匹配出来
- 方法二:如果正则表达式中出现分组,会按照正则表达式匹配结果,再讲符合分组中正则表达式的规则的结果匹配出来
- slit:按照正则表达式的规则切割字符串
- sub:将符合正则表达式的字符串替换为新的字符串
- search:查看字符串中第一个符合正则表达式的结果None
- match:查看字符串的开头是否符合正则表达式的规则None
import re
str1 = 'a,b.c'
re_str ='a'
print(re.match(re_str, str1))
re_str = '[a-z]'
print(re.search(re_str, str1))
re_str = '[,.]'
print(re.split(re_str, str1))
# re.sub(正则表达式,newStr,oldStr)
print(re.sub('[,.]', '', str1))
- findall,split,sub常用
str1))
re_str = ‘a-z’
print(re.search(re_str, str1))
re_str = ‘[,.]’
print(re.split(re_str, str1))
re.sub(正则表达式,newStr,oldStr)
print(re.sub(‘[,.]’, ‘’, str1))
+ findall,split,sub常用
+ match,search,fullmatch不常用