python 面試題(高級)


42.Python中類方法、類實例方法、靜態方法有何區別?

類方法: 是類對象的方法,在定義時需要在上方使用 @classmethod 進行裝飾,形參為cls,表示類對象,類對象和實例對象都可調用

類實例方法: 是類實例化對象的方法,只有實例對象可以調用,形參為self,指代對象本身;

靜態方法: 是一個任意函數,在其上方使用 @staticmethod 進行裝飾,可以用對象直接調用,靜態方法實際上跟該類沒有太大關系

43.遍歷一個object的所有屬性,並print每一個屬性名?

class Car: def __init__(self,name,loss): # loss [價格,油耗,公里數] self.name = name self.loss = loss def getName(self): return self.name def getPrice(self): # 獲取汽車價格 return self.loss[0] def getLoss(self): # 獲取汽車損耗值 return self.loss[1] * self.loss[2] Bmw = Car("寶馬",[60,9,500]) # 實例化一個寶馬車對象 print(getattr(Bmw,"name")) # 使用getattr()傳入對象名字,屬性值。 print(dir(Bmw)) # 獲Bmw所有的屬性和方法

44.寫一個類,並讓它盡可能多的支持操作符?

class Array: __list = [] def __init__(self): print "constructor" def __del__(self): print "destruct" def __str__(self): return "this self-defined array class" def __getitem__(self,key): return self.__list[key] def __len__(self): return len(self.__list) def Add(self,value): self.__list.append(value) def Remove(self,index): del self.__list[index] def DisplayItems(self): print "show all items---" for item in self.__list: print item 

45.介紹Cython,Pypy Cpython Numba各有什么缺點

Cython

46.請描述抽象類和接口類的區別和聯系

1.抽象類: 規定了一系列的方法,並規定了必須由繼承類實現的方法。由於有抽象方法的存在,所以抽象類不能實例化。可以將抽象類理解為毛坯房,門窗,牆面的樣式由你自己來定,所以抽象類與作為基類的普通類的區別在於約束性更強

2.接口類:與抽象類很相似,表現在接口中定義的方法,必須由引用類實現,但他與抽象類的根本區別在於用途:與不同個體間溝通的規則,你要進宿舍需要有鑰匙,這個鑰匙就是你與宿舍的接口,你的舍友也有這個接口,所以他也能進入宿舍,你用手機通話,那么手機就是你與他人交流的接口

3.區別和關聯:

1.接口是抽象類的變體,接口中所有的方法都是抽象的,而抽象類中可以有非抽象方法,抽象類是聲明方法的存在而不去實現它的類

2.接口可以繼承,抽象類不行

3.接口定義方法,沒有實現的代碼,而抽象類可以實現部分方法

4.接口中基本數據類型為static而抽象類不是

47.Python中如何動態獲取和設置對象的屬性?

if hasattr(Parent, 'x'): print(getattr(Parent, 'x')) setattr(Parent, 'x',3) print(getattr(Parent,'x'))

內存管理與垃圾回收機制

48.哪些操作會導致Python內存溢出,怎么處理?

49.關於Python內存管理,下列說法錯誤的是 B

A,變量不必事先聲明 B,變量無須先創建和賦值而直接使用

C,變量無須指定類型 D,可以使用del釋放資源

50.Python的內存管理機制及調優手段?

內存管理機制: 引用計數、垃圾回收、內存池

引用計數:引用計數是一種非常高效的內存管理手段,當一個Python對象被引用時其引用計數增加1,

當其不再被一個變量引用時則計數減1,當引用計數等於0時對象被刪除。弱引用不會增加引用計數

垃圾回收:

1.引用計數

引用計數也是一種垃圾收集機制,而且也是一種最直觀、最簡單的垃圾收集技術。當Python的某個對象的引用計數降為0時,說明沒有任何引用指向該對象,該對象就成為要被回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數變為1,如果引用被刪除,對象的引用計數為0,那么該對象就可以被垃圾回收。不過如果出現循環引用的話,引用計數機制就不再起有效的作用了。

2.標記清除

https://foofish.net/python-gc.html

調優手段

1.手動垃圾回收

2.調高垃圾回收閾值

3.避免循環引用

51.內存泄露是什么?如何避免?

內存泄漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存。內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存后,由於設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。

__del__()函數的對象間的循環引用是導致內存泄露的主凶。不使用一個對象時使用: del object 來刪除一個對象的引用計數就可以有效防止內存泄露問題。

通過Python擴展模塊gc 來查看不能回收的對象的詳細信息。

可以通過 sys.getrefcount(obj) 來獲取對象的引用計數,並根據返回值是否為0來判斷是否內存泄露

函數

52.python常見的列表推導式?

[表達式 for 變量 in 列表] 或者 [表達式 for 變量 in 列表 if 條件]

53.簡述read、readline、readlines的區別?

read 讀取整個文件

readline 讀取下一行

readlines 讀取整個文件到一個迭代器以供我們遍歷

54.什么是Hash(散列函數)?

散列函數(英語:Hash function)又稱散列算法、哈希函數,是一種從任何一種數據中創建小的數字“指紋”的方法。散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來。該函數將數據打亂混合,重新創建一個叫做散列值(hash values,hash codes,hash sums,或hashes)的指紋。散列值通常用一個短的隨機字母和數字組成的字符串來代表

55.python函數重載機制?

函數重載主要是為了解決兩個問題。 1。可變參數類型。 2。可變參數個數。

另外,一個基本的設計原則是,僅僅當兩個函數除了參數類型和參數個數不同以外,其功能是完全相同的,此時才使用函數重載,如果兩個函數的功能其實不同,那么不應當使用重載,而應當使用一個名字不同的函數。

好吧,那么對於情況 1 ,函數功能相同,但是參數類型不同,python 如何處理?答案是根本不需要處理,因為 python 可以接受任何類型的參數,如果函數的功能相同,那么不同的參數類型在 python 中很可能是相同的代碼,沒有必要做成兩個不同函數。

那么對於情況 2 ,函數功能相同,但參數個數不同,python 如何處理?大家知道,答案就是缺省參數。對那些缺少的參數設定為缺省參數即可解決問題。因為你假設函數功能相同,那么那些缺少的參數終歸是需要用的。

好了,鑒於情況 1 跟 情況 2 都有了解決方案,python 自然就不需要函數重載了。

56.寫一個函數找出一個整數數組中,第二大的數

57.手寫一個判斷時間的裝飾器

import datetime class TimeException(Exception): def __init__(self, exception_info): super().__init__() self.info = exception_info def __str__(self): return self.info def timecheck(func): def wrapper(*args, **kwargs): if datetime.datetime.now().year == 2019: func(*args, **kwargs) else: raise TimeException("函數已過時") return wrapper @timecheck def test(name): print("Hello {}, 2019 Happy".format(name)) if __name__ == "__main__": test("backbp")

58.使用Python內置的filter()方法來過濾?

list(filter(lambda x: x % 2 == 0, range(10)))

59.編寫函數的4個原則

1.函數設計要盡量短小

2.函數聲明要做到合理、簡單、易於使用

3.函數參數設計應該考慮向下兼容

4.一個函數只做一件事情,盡量保證函數語句粒度的一致性

60.函數調用參數的傳遞方式是值傳遞還是引用傳遞?

Python的參數傳遞有:位置參數、默認參數、可變參數、關鍵字參數。

函數的傳值到底是值傳遞還是引用傳遞、要分情況:

不可變參數用值傳遞:像整數和字符串這樣的不可變對象,是通過拷貝進行傳遞的,因為你無論如何都不可能在原處改變不可變對象。

可變參數是引用傳遞:比如像列表,字典這樣的對象是通過引用傳遞、和C語言里面的用指針傳遞數組很相似,可變對象能在函數內部改變。

61.如何在function里面設置一個全局變量

globals() # 返回包含當前作用余全局變量的字典。 global 變量 設置使用全局變量

62.對缺省參數的理解 ?

缺省參數指在調用函數的時候沒有傳入參數的情況下,調用默認的參數,在調用函數的同時賦值時,所傳入的參數會替代默認參數。

*args是不定長參數,它可以表示輸入參數是不確定的,可以是任意多個。

**kwargs是關鍵字參數,賦值的時候是以鍵值對的方式,參數可以是任意多對在定義函數的時候

不確定會有多少參數會傳入時,就可以使用兩個參數

63.Mysql怎么限制IP訪問?

64.帶參數的裝飾器?

帶定長參數的裝飾器

def new_func(func): def wrappedfun(username, passwd): if username == 'root' and passwd == '123456789': print('通過認證') print('開始執行附加功能') return func() else: print('用戶名或密碼錯誤') return return wrappedfun @new_func def origin(): print('開始執行函數') origin('root','123456789')

帶不定長參數的裝飾器

def new_func(func): def wrappedfun(*parts): if parts: counts = len(parts) print('本系統包含 ', end='') for part in parts: print(part, ' ',end='') print('等', counts, '部分') return func() else: print('用戶名或密碼錯誤') return func() return wrappedfun

65.為什么函數名字可以當做參數用?

Python中一切皆對象,函數名是函數在內存中的空間,也是一個對象

66.Python中pass語句的作用是什么?

在編寫代碼時只寫框架思路,具體實現還未編寫就可以用pass進行占位,是程序不報錯,不會進行任何操作。

67.有這樣一段代碼,print c會輸出什么,為什么?

a = 10 b = 20 c = [a] a = 15

答:10對於字符串,數字,傳遞是相應的值

68.交換兩個變量的值?

a, b = b, a

69.map函數和reduce函數?

map(lambda x: x * x, [1, 2, 3, 4]) # 使用 lambda # [1, 4, 9, 16] reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 相當於 ((1 * 2) * 3) * 4 # 24

70.回調函數,如何通信的?

回調函數是把函數的指針(地址)作為參數傳遞給另一個函數,將整個函數當作一個對象,賦值給調用的函數。

71.Python主要的內置數據類型都有哪些? print dir( ‘a ’) 的輸出?

內建類型:布爾類型,數字,字符串,列表,元組,字典,集合

輸出字符串'a'的內建方法

72.map(lambda x:xx,[y for y in range(3)])的輸出?

[0, 1, 4]

73.hasattr() getattr() setattr() 函數使用詳解?

hasattr(object,name)函數:

判斷一個對象里面是否有name屬性或者name方法,返回bool值,有name屬性(方法)返回True,否則返回False。

class function_demo(object): name = 'demo' def run(self): return "hello function" functiondemo = function_demo() res = hasattr(functiondemo, "name") # 判斷對象是否有name屬性,True res = hasattr(functiondemo, "run") # 判斷對象是否有run方法,True res = hasattr(functiondemo, "age") # 判斷對象是否有age屬性,False print(res)

getattr(object, name[,default])函數:

獲取對象object的屬性或者方法,如果存在則打印出來,如果不存在,打印默認值,默認值可選。注意:如果返回的是對象的方法,則打印結果是:方法的內存地址,如果需要運行這個方法,可以在后面添加括號().

functiondemo = function_demo() getattr(functiondemo, "name")# 獲取name屬性,存在就打印出來 --- demo getattr(functiondemo, "run") # 獲取run 方法,存在打印出方法的內存地址 getattr(functiondemo, "age") # 獲取不存在的屬性,報錯 getattr(functiondemo, "age", 18)# 獲取不存在的屬性,返回一個默認值

setattr(object, name, values)函數:

給對象的屬性賦值,若屬性不存在,先創建再賦值

class function_demo(object): name = "demo" def run(self): return "hello function" functiondemo = function_demo() res = hasattr(functiondemo, "age") # 判斷age屬性是否存在,False print(res) setattr(functiondemo, "age", 18) # 對age屬性進行賦值,無返回值 res1 = hasattr(functiondemo, "age") # 再次判斷屬性是否存在,True

綜合使用

class function_demo(object): name = "demo" def run(self): return "hello function" functiondemo = function_demo() res = hasattr(functiondemo, "addr") # 先判斷是否存在 if res: addr = getattr(functiondemo, "addr") print(addr) else: addr = getattr(functiondemo, "addr", setattr(functiondemo, "addr", "北京首都")) print(addr)

74.一句話解決階乘函數?

reduce(lambda x,y : x*y,range(1,n+1))

75.什么是lambda函數? 有什么好處?

lambda 函數是一個可以接收任意多個參數(包括可選參數)並且返回單個表達式值的函數

1.lambda函數比較輕便,即用即仍,很適合需要完成一項功能,但是此功能只在此一處使用,連名字都很隨意的情況下

2.匿名函數,一般用來給filter,map這樣的函數式編程服務

3.作為回調函數,傳遞給某些應用,比如消息處理

76.遞歸函數停止的條件?

遞歸的終止條件一般定義在遞歸函數內部,在遞歸調用前要做一個條件判斷,根據判斷的結果選擇是繼續調用自身,還是return,,返回終止遞歸。

終止的條件:判斷遞歸的次數是否達到某一限定值

2.判斷運算的結果是否達到某個范圍等,根據設計的目的來選擇

77.下面這段代碼的輸出結果將是什么?請解釋。

def multipliers(): return [lambda x: i *x for i in range(4)] print([m(2) for m in multipliers()])

上面代碼的輸出結果是[6,6,6,6],不是我們想的[0,2,4,6]

你如何修改上面的multipliers的定義產生想要的結果?

上述問題產生的原因是python閉包的延遲綁定。這意味着內部函數被調用時,參數的值在閉包內進行查找。因此,當任何由multipliers()返回的函數被調用時,i的值將在附近的范圍進行查找。那時,不管返回的函數是否被調用,for循環已經完成,i被賦予了最終的值3.

def multipliers(): for i in range(4): yield lambda x: i *x
def multipliers(): return [lambda x,i = i: i*x for i in range(4)]

78.什么是lambda函數?它有什么好處?寫一個匿名函數求兩個數的和

lambda函數是匿名函數,使用lambda函數能創建小型匿名函數,這種函數得名於省略了用def聲明函數的標准步驟

設計模式

79.對設計模式的理解,簡述你了解的設計模式?

設計模式是經過總結,優化的,對我們經常會碰到的一些編程問題的可重用解決方案。一個設計模式並不像一個類或一個庫那樣能夠直接作用於我們的代碼,反之,設計模式更為高級,它是一種必須在特定情形下實現的一種方法模板。 常見的是工廠模式和單例模式

80.請手寫一個單例

#python2
class A(object): __instance = None def __new__(cls,*args,**kwargs): if cls.__instance is None: cls.__instance = objecet.__new__(cls) return cls.__instance else: return cls.__instance

81.單例模式的應用場景有那些?

單例模式應用的場景一般發現在以下條件下: 資源共享的情況下,避免由於資源操作時導致的性能或損耗等,如日志文件,應用配置。 控制資源的情況下,方便資源之間的互相通信。如線程池等,1,網站的計數器 2,應用配置 3.多線程池 4數據庫配置 數據庫連接池 5.應用程序的日志應用...

82.用一行代碼生成[1,4,9,16,25,36,49,64,81,100]

print([x*x for x in range(1, 11)])

83.對裝飾器的理解,並寫出一個計時器記錄方法執行性能的裝飾器?

裝飾器本質上是一個callable object ,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。

import time from functools import wraps def timeit(func): @wraps(func) def wrapper(*args, **kwargs): start = time.clock() ret = func(*args, **kwargs) end = time.clock() print('used:',end-start) return ret return wrapper @timeit def foo(): print('in foo()'foo())

84.解釋以下什么是閉包?

在函數內部再定義一個函數,並且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為閉包。

85.函數裝飾器有什么作用?

裝飾器本質上是一個callable object,它可以在讓其他函數在不需要做任何代碼的變動的前提下增加額外的功能。裝飾器的返回值也是一個函數的對象,它經常用於有切面需求的場景。比如:插入日志,性能測試,事務處理,緩存。權限的校驗等場景,有了裝飾器就可以抽離出大量的與函數功能本身無關的雷同代碼並發並繼續使用。 詳細參考:https://manjusaka.itscoder.com/2018/02/23/something-about-decorator/

86.生成器,迭代器的區別?

迭代器是遵循迭代協議的對象。用戶可以使用 iter() 以從任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一個方法則是創建一個另一種形式的迭代器 —— generator 。要獲取下一個元素,則使用成員函數 next()(Python 2)或函數 next() function (Python 3) 。當沒有元素時,則引發 StopIteration 此例外。若要實現自己的迭代器,則只要實現 next()(Python 2)或 __next__()( Python 3)

生成器(Generator),只是在需要返回數據的時候使用yield語句。每次next()被調用時,生成器會返回它脫離的位置(它記憶語句最后一次執行的位置和所有的數據值)

區別: 生成器能做到迭代器能做的所有事,而且因為自動創建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節省內存。除了創建和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常。

官方介紹:https://docs.python.org/3/tutorial/classes.html#iterators

87.X是什么類型?

X= (i for i in range(10))
X是 generator類型

88.請用一行代碼 實現將1-N 的整數列表以3為單位分組

N =100 print ([[x for x in range(1,100)] [i:i+3] for i in range(0,100,3)])

89.Python中yield的用法?

yield就是保存當前程序執行狀態。你用for循環的時候,每次取一個元素的時候就會計算一次。用yield的函數叫generator,和iterator一樣,它的好處是不用一次計算所有元素,而是用一次算一次,可以節省很多空間,generator每次計算需要上一次計算結果,所以用yield,否則一return,上次計算結果就沒了

面向對象

90.Python中的可變對象和不可變對象?

不可變對象,該對象所指向的內存中的值不能被改變。當改變某個變量時候,由於其所指的值不能被改變,相當於把原來的值復制一份后再改變,這會開辟一個新的地址,變量再指向這個新的地址。

可變對象,該對象所指向的內存中的值可以被改變。變量(准確的說是引用)改變后,實際上其所指的值直接發生改變,並沒有發生復制行為,也沒有開辟出新的地址,通俗點說就是原地改變。

Pyhton中,數值類型(int 和float),字符串str、元祖tuple都是不可變類型。而列表list、字典dict、集合set是可變類型

91.Python的魔法方法

魔法方法就是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了這些方法中的某一個,那么這個方法就會在特殊的情況下被Python所調用,你可以定義自己想要的行為,而這一切都是自動發生的,它們經常是兩個下划線包圍來命名的(比如__init___,__len__),Python的魔法方法是非常強大的所以了解其使用方法也變得尤為重要!

__init__構造器,當一個實例被創建的時候初始化的方法,但是它並不是實例化調用的第一個方法。

__new__才是實例化對象調用的第一個方法,它只取下cls參數,並把其他參數傳給__init___.

___new__很少使用,但是也有它適合的場景,尤其是當類繼承自一個像元祖或者字符串這樣不經常改變的類型的時候。

__call__讓一個類的實例像函數一樣被調用

__getitem__定義獲取容器中指定元素的行為,相當於self[key]

__getattr__定義當用戶試圖訪問一個不存在屬性的時候的行為。

__setattr__定義當一個屬性被設置的時候的行為

__getattribute___定義當一個屬性被訪問的時候的行為

92.面向對象中怎么實現只讀屬性?

將對象私有化,通過共有方法提供一個讀取數據的接口

class person: def __init__(self, x): self.__age = 10 def age(self): return self.__age t = person(22) # t.__age =100 print(t.age())

最好的方法

class MyCls(object): __weight = 50 @property def weight(self): return self.__weight 

93.談談你對面向對象的理解?

面向對象是相當於面向過程而言的,面向過程語言是一種基於功能分析的,以算法為中心的程序設計方法,而面向對象是一種基於結構分析的,以數據為中心的程序設計思想。在面向對象語言中有一個很重要的東西,叫做類。面向對象有三大特性:封裝、繼承、多態。

正則表達式

94.請寫出一段代碼用正則匹配出ip?

95.a = “abbbccc”,用正則匹配為abccc,不管有多少b,就出現一次?

思路:不管有多少個b替換成一個

re.sub(r'b+', 'b', a)

96.Python字符串查找和替換?

a、str.find():正序字符串查找函數
函數原型:
str.find(substr [,pos_start [,pos_end ] ] )
返回str中第一次出現的substr的第一個字母的標號,如果str中沒有substr則返回-1,也就是說從左邊算起的第一次出現的substr的首字母標號。

參數說明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的開始位置,默認是從下標0開始查找
pos_end:代表查找的結束位置

例子:
'aabbcc.find('bb')' # 2

b、str.index():正序字符串查找函數
index()函數類似於find()函數,在Python中也是在字符串中查找子串第一次出現的位置,跟find()不同的是,未找到則拋出異常。

函數原型:
str.index(substr [, pos_start, [ pos_end ] ] )

參數說明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的開始位置,默認是從下標0開始查找
pos_end:代表查找的結束位置

例子:
'acdd l1 23'.index(' ') # 4

c、str.rfind():倒序字符串查找函數

函數原型:
str.rfind( substr [, pos_start [,pos_ end ] ])
返回str中最后出現的substr的第一個字母的標號,如果str中沒有substr則返回-1,也就是說從右邊算起的第一次出現的substr的首字母標號。

參數說明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的開始位置,默認是從下標0開始查找
pos_end:代表查找的結束位置

例子:
'adsfddf'.rfind('d') # 5

d、str.rindex():倒序字符串查找函數
rindex()函數類似於rfind()函數,在Python中也是在字符串中倒序查找子串最后一次出現的位置,跟rfind()不同的是,未找到則拋出異常。

函數原型:
str.rindex(substr [, pos_start, [ pos_end ] ] )

參數說明:
str:代表原字符串
substr:代表要查找的字符串
pos_start:代表查找的開始位置,默認是從下標0開始查找
pos_end:代表查找的結束位置

例子:
 'adsfddf'.rindex('d') # 5

e、使用re模塊進行查找和替換:
函數 說明
re.match(pat, s) 只從字符串s的頭開始匹配,比如(‘123’, ‘12345’)匹配上了,而(‘123’,’01234’)就是沒有匹配上,沒有匹配上返回None,匹配上返回matchobject
re.search(pat, s) 從字符串s的任意位置都進行匹配,比如(‘123’,’01234’)就是匹配上了,只要s只能存在符合pat的連續字符串就算匹配上了,沒有匹配上返回None,匹配上返回matchobject
re.sub(pat,newpat,s) re.sub(pat,newpat,s) 對字符串中s的包含的所有符合pat的連續字符串進行替換,如果newpat為str,那么就是替換為newpat,如果newpat是函數,那么就按照函數返回值替換。sub函數兩個有默認值的參數分別是count表示最多只處理前幾個匹配的字符串,默認為0表示全部處理;最后一個是flags,默認為0
f、使用replace()進行替換:
基本用法:對象.replace(rgExp,replaceText,max)

其中,rgExp和replaceText是必須要有的,max是可選的參數,可以不加。
rgExp是指正則表達式模式或可用標志的正則表達式對象,也可以是 String 對象或文字;
replaceText是一個String 對象或字符串文字;
max是一個數字。
對於一個對象,在對象的每個rgExp都替換成replaceText,從左到右最多max次。

s1='hello world'
s1.replace('world','liming')

97.用Python匹配HTML tag的時候,<.> 和 <.?> 有什么區別

第一個代表貪心匹配,第二個代表非貪心;
?在一般正則表達式里的語法是指的"零次或一次匹配左邊的字符或表達式"相當於{0,1}
而當?后綴於*,+,?,{n},{n,},{n,m}之后,則代表非貪心匹配模式,也就是說,盡可能少的匹配左邊的字符或表達式,這里是盡可能少的匹配.(任意字符)

所以:第一種寫法是,盡可能多的匹配,就是匹配到的字符串盡量長,第二中寫法是盡可能少的匹配,就是匹配到的字符串盡量短。
比如<tag>tag>tag>end,第一個會匹配<tag>tag>tag>,第二個會匹配<tag>。

98.正則表達式貪婪與非貪婪模式的區別?

貪婪模式:
定義:正則表達式去匹配時,會盡量多的匹配符合條件的內容
標識符:+,?,*,{n},{n,},{n,m}
匹配時,如果遇到上述標識符,代表是貪婪匹配,會盡可能多的去匹配內容

非貪婪模式:
定義:正則表達式去匹配時,會盡量少的匹配符合條件的內容 也就是說,一旦發現匹配符合要求,立馬就匹配成功,而不會繼續匹配下去(除非有g,開啟下一組匹配)
標識符:+?,??,*?,{n}?,{n,}?,{n,m}?
可以看到,非貪婪模式的標識符很有規律,就是貪婪模式的標識符后面加上一個?

參考文章:https://dailc.github.io/2017/07/06/regularExpressionGreedyAndLazy.html

99.寫出開頭匹配字母和下划線,末尾是數字的正則表達式?

s1='_aai0efe00'
res=re.findall('^[a-zA-Z_]?[a-zA-Z0-9_]{1,}\d$',s1)
print(res)

100.正則表達式操作

101.請匹配出變量A 中的json字符串。

102.怎么過濾評論中的表情?

思路:主要是匹配表情包的范圍,將表情包的范圍用空替換掉
import re
pattern = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
pattern.sub('',text)

103.簡述Python里面search和match的區別

match()函數只檢測字符串開頭位置是否匹配,匹配成功才會返回結果,否則返回None;
search()函數會在整個字符串內查找模式匹配,只到找到第一個匹配然后返回一個包含匹配信息的對象,該對象可以通過調用group()方法得到匹配的字符串,如果字符串沒有匹配,則返回None。

104.請寫出匹配ip的Python正則表達式

105.Python里match與search的區別?

見103題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM