day16 re模塊和面向?qū)ο?/h2>

1. re.compile()

"""
compile(正則表達(dá)式) - 編譯正則表達(dá)式,創(chuàng)建正則表達(dá)式對(duì)象
"""
re_obj = compile(r'\d{3}')

fullmatch(r'\d{3}', '234')
re_obj.fullmatch('234')

search(r'\d{3}', 'hu23hjk890jhkh78')
re_obj.search('hu23hjk890jhkh78')

2.匹配

"""
1)fullmatch(正則表達(dá)式, 字符串) - 讓整個(gè)字符串和正則表達(dá)式進(jìn)行匹配
2)match(正則表達(dá)式, 字符串) - 匹配字符串開(kāi)頭
如果匹配不到結(jié)果是None,如果匹配成功了結(jié)果是匹配對(duì)象
"""
re_str = r'\d{3}'
print(fullmatch(re_str, '732'))
print(fullmatch(re_str, '732hjas')) # None
print(match(re_str, '789'))
print(match(re_str, '789j手機(jī)打開(kāi)'))

設(shè)置同時(shí)忽略大小寫(xiě)和單行匹配

print(fullmatch(r'123.[a-z]{3}', '123\nHNA', flags=S|IGNORECASE))
print(fullmatch(r'(?is)123.[a-z]{3}', '123\nHNA'))

3.匹配對(duì)象

print('=============================')

result = match(re_str, '789j手機(jī)打開(kāi)')

re_str = r'(\d{2})-([a-z]{3})'
result = match(re_str, '23-sjm回款及時(shí)發(fā)貨')
print(result)

1)獲取匹配到的字符串

匹配對(duì)象.group() - 獲取整個(gè)正則表達(dá)式匹配到結(jié)果

print(result.group()) # 23-sjm

匹配對(duì)象.group(分組號(hào)) - 獲取正則表達(dá)式中指定的分組匹配到的結(jié)果(分組號(hào)從1開(kāi)始)

print(result.group(1)) # 23
print(result.group(2)) # sjm

2)獲取匹配到的子串的范圍

匹配對(duì)象.span()

print(result.span()) # (0, 6)
print(result.span(2)) # (3, 6)

3)獲取原字符串

匹配對(duì)象.string

print(result.string)

4.查找

"""
1)search(正則表達(dá)式,字符串) - 在字符串中查找第一個(gè)能和正則表達(dá)式匹配的子串。如果找到了返回匹配對(duì)象,找不到返回None

  1. findall(正則表達(dá)式,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串。返回一個(gè)列表,列表中的元素是字符串
  2. finditer(正則表達(dá)式,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串。返回一個(gè)迭代器,迭代器中的元素是匹配對(duì)象
    """
    str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
    result = search(r'\d+', str1)
    print(result) # <re.Match object; span=(3, 6), match='123'>

result = findall(r'\d+', str1)
print(result) # ['123', '123', '456', '98', '7', '123']

result = findall(r'\d+[a-z]', str1)
print(result) # ['123a', '456k', '7h', '123o']

findall正則中如果有分組,只獲取分組匹配到的內(nèi)容

result = findall(r'(\d+)[a-z]', str1)
print(result) # ['123', '456', '7', '123']

result = findall(r'(\d+)([a-z])', str1)
print(result) # [('123', 'a'), ('456', 'k'), ('7', 'h'), ('123', 'o')]

str2 = '9h3jabc===9k2mabc9293h0oabc==!!!'
result = findall(r'(\d[a-zA-Z]){2}abc', str2)
print(result)

result = finditer(r'((\d[a-zA-Z]){2})abc', str2)

print(list(result))

for x in result:
print(x.group(1))

5.切割

split(正則表達(dá)式, 字符串) - 將字符串中能和正則表達(dá)式匹配的子串作為切割點(diǎn),對(duì)字符串進(jìn)行切割。返回值是列表,列表中的元素是字符串

split(正則表達(dá)式, 字符串, 次數(shù)) - 指定切割次數(shù)

str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
result = split(r'\d+', str1)
print(result) # ['and', '=hu', 'aaa', 'klk', '!ll', 'hu', 'oop']

result = split(r'\d+', str1, 3)
print(result) # ['and', '=hu', 'aaa', 'klk98!ll7hu123oop']

6.替換

sub(正則表達(dá)式, 字符串1, 字符串2) - 將字符串2中能和正則表達(dá)式匹配的子串全部替換成字符串1

sub(正則表達(dá)式, 字符串1, 字符串2, 次數(shù)) - 限制替換次數(shù)

str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
new_str1 = sub(r'\d+', '+', str1)
print(new_str1)

sentence = '你丫是傻 叉嗎? 我操你大爺?shù)? F u c k you.'
re_str = r'(?i)[操肏艸草曹]|f\su\sc\sk|s\sh\si\st|傻\s[比屄逼叉缺吊屌]|煞\s筆'
new_sentence = sub(re_str, '*', sentence)
print(new_sentence)

1.什么是類(lèi)、什么是對(duì)象

"""
類(lèi)就是擁有相同屬性和相同功能的對(duì)象的集合(抽象)
對(duì)象就是類(lèi)的實(shí)例(具體)

從生活的角度:
如果人是類(lèi), 余婷就是對(duì)象,駱老師是另一個(gè)對(duì)象
如果杯子是類(lèi),我桌上的這個(gè)杯子就是對(duì)象
"""

2.定義類(lèi)(說(shuō)清楚共同屬性和功能是哪些)

"""
語(yǔ)法:
class 類(lèi)名:
類(lèi)的說(shuō)明文檔
類(lèi)的內(nèi)容(包含屬性和方法)

說(shuō)明:
class - 關(guān)鍵字
類(lèi)名 - 程序員自己命名
要求:標(biāo)識(shí)符,不能是關(guān)鍵字
規(guī)范:駝峰式命名,并且首字母大寫(xiě);見(jiàn)名知義;不適用系統(tǒng)的函數(shù)名、類(lèi)名、模塊名
類(lèi)的說(shuō)明文檔 - 用""""""引起來(lái)的說(shuō)明性文字,主要說(shuō)清楚類(lèi)提供了哪些屬性和哪些功能
類(lèi)的內(nèi)容 - 主要包含屬性和方法(定義在類(lèi)中的函數(shù)叫方法)
"""

PEP8命名規(guī)范

student_name = '張三'

駝峰式命名

studentName = '李四'

定義一個(gè)人類(lèi)

class Human:
"""人類(lèi)"""
def eat(self):
print('人類(lèi)在吃飯')

def sleep(self):
    print('人類(lèi)睡覺(jué)!')

class Servant:
"""傭人類(lèi)"""
def wash(self):
print('洗衣服')

def cook(self, food):
    print(f'做{food}')

3.定義對(duì)象(創(chuàng)建對(duì)象)

"""
語(yǔ)法:
類(lèi)名()

說(shuō)明:
類(lèi)名 - 是已經(jīng)定義好的類(lèi)的類(lèi)名
"""
p1 = Human() # 創(chuàng)建人類(lèi)的對(duì)象p1
p2 = Human()
print(p1)
print(p2)

s1 = Servant() # 創(chuàng)建傭人類(lèi)的對(duì)象s1
print(s1)
s2 = Servant()

s1.wash()
s2.wash()
s1.cook('面條')
s2.cook('包子')

1.方法(定義在類(lèi)中函數(shù))

"""
類(lèi)中的方法分為三種:對(duì)象方法、類(lèi)方法、靜態(tài)方法

1)對(duì)象方法
怎么定義:直接定義在類(lèi)中函數(shù)就是對(duì)象方法
特點(diǎn):自帶參數(shù)self(self在通過(guò)對(duì)象調(diào)用的時(shí)候不用傳參, 系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self),誰(shuí)調(diào)用指向誰(shuí)
怎么調(diào)用:用對(duì)象去調(diào)用(對(duì)象.方法名())

2)類(lèi)方法
怎么定義: 定義函數(shù)前加裝飾器 @classmethod
特點(diǎn):自帶參數(shù)cls(cls在通過(guò)類(lèi)調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將當(dāng)前類(lèi)傳給cls)
怎么調(diào)用:用類(lèi)調(diào)用(類(lèi).方法名())

3)靜態(tài)方法
怎么定義: 定義函數(shù)前加裝飾器 @staticmethod
特點(diǎn):沒(méi)有默認(rèn)參數(shù)
怎么調(diào)用:用類(lèi)調(diào)用

4)對(duì)象方法、類(lèi)方法和靜態(tài)方法怎么選:
如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象的屬性,就選對(duì)象方法
"""

class Dog:
# eat是對(duì)象方法
def eat(self):
# self = dog1
print(f'self:{self}')
print('狗啃骨頭')

# count是類(lèi)方法
@classmethod
def count(cls):
    # Dog能做的cls都能做
    print(f'cls:{cls}')
    dog2 = Dog()
    dog3 = cls()
    print(dog2, dog3)
    print('狗的數(shù)量是: 100')

@classmethod
def func(cls):
    print('類(lèi)方法')

#  func2是靜態(tài)方法
@staticmethod
def func2():
    print('靜態(tài)方法')

創(chuàng)建對(duì)象

dog1 = Dog()
print(f'dog1:{dog1}')

用對(duì)象調(diào)用對(duì)象方法

dog1.eat()

用類(lèi)調(diào)用類(lèi)方法

Dog.count()

用類(lèi)調(diào)用靜態(tài)方法

Dog.func2()

print('=========================注意:======================')

從本質(zhì)上講,類(lèi)中的所有的方法都可以用對(duì)象和類(lèi)調(diào)用,但是不能這么做

Dog.eat(12) # 如果用類(lèi)調(diào)用對(duì)象方法,self就會(huì)變成普通的參數(shù),沒(méi)有存在的價(jià)值

dog1 = Dog()
dog1.count() # 用對(duì)象調(diào)用類(lèi)方法的時(shí)候cls指向的還是類(lèi)(不會(huì)指向?qū)ο?

dog1.func2()
Dog.func2()

1.構(gòu)造方法

"""
構(gòu)造方法: 函數(shù)名和類(lèi)名是一樣的,用來(lái)創(chuàng)建對(duì)象的方法就是構(gòu)造方法(Python中的構(gòu)造方法,在定義類(lèi)的時(shí)候系統(tǒng)已經(jīng)自動(dòng)創(chuàng)建好了)
"""

2.init方法

"""
init方法又叫初始化方法,用來(lái)在創(chuàng)建對(duì)象的是對(duì)對(duì)象進(jìn)行初始化操作的。
當(dāng)我們通過(guò)類(lèi)創(chuàng)建對(duì)象的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法來(lái)對(duì)象創(chuàng)建出來(lái)的對(duì)象進(jìn)行初始化。

調(diào)用構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候需不需要參數(shù),需要幾個(gè),看被自動(dòng)調(diào)用的init
"""

class Person:
def init(self, a, b):
print('初始化方法:', a, b)
print(f'self:{self}')

p1 = Person(10, 20)
print(p1)

p2 = Person(a=100, b=200)

p2 = Person()

"""
def Person(*args, *kwargs):
對(duì)象 = 申請(qǐng)空間創(chuàng)建對(duì)象
對(duì)象.init(
args, **kwargs)
return 對(duì)象
"""

1.屬性: 對(duì)象屬性和類(lèi)屬性

"""
對(duì)象屬性: 對(duì)象屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣
a.定義在init方法中
b.以 self.屬性名 = 值
c.通過(guò) 對(duì)象.屬性名 的方式使用屬性
"""

class Person:
def init(self, name1, age1, gender1='男'):
self.name = name1
self.age = age1
self.gender = gender1

def eat(self):
    print(f'{self.name}吃飯')

p1 = Person('小明', 1)
print(p1.name, p1.age, p1.gender)

p2 = Person('小花', 3, '女')
print(p2.name, p2.age, p2.gender)
p2.name = '大花'
print(p2.name)

p1.eat()

p2.eat()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容