Python之路【第八篇】:Python模块
閱讀目錄
一、模塊和包
模塊(module)的概念:
在計算機(jī)程序的開發(fā)過程中,隨著程序代碼越寫越多,在一個文件里代碼會越來越長,越來越不容易維護(hù)。
為了編寫可維護(hù)的代碼,我們把很多函數(shù)分組,分別放到不同的文件里,這樣,每個文件包含的代碼就相對較少,很多編程語言都采用這種組織代碼的方式。在Python中,一個.py文件就稱之為一個模塊(module)。
使用模塊有哪些好處?
1、最大的好處就是大大提高了代碼的可維護(hù)性。 2、編寫代碼不必從零開始。當(dāng)一個模塊編寫完成,就可以被其他地方調(diào)用。我們在編寫程序的時候,也經(jīng)常飲用其他模塊,包括Python內(nèi)置的模塊和來自第三方的模塊。模塊一共分為三種:
1、python標(biāo)準(zhǔn)庫 2、第三方模塊 3、應(yīng)用程序自定義模塊注意:
使用模塊還可以避免函數(shù)名跟變量名沖突。相同名字的函數(shù)和變量完全可以分別存在不同的模塊中,因此,我們在自己編寫模塊時,不必考慮名字會與其他模塊沖突。但是也要注意,盡量不要與內(nèi)置函數(shù)名字沖突。
二、模塊的導(dǎo)入方法
1、import語句
import module1,[module2[,...moduleN]]當(dāng)我們使用import語句的時候,Python解釋器是怎樣找到對應(yīng)的文件?答案就是解釋器有自己的搜索路徑,存在sys.path里。
import sys print(sys.path)運(yùn)行結(jié)果如下: ['G:\\python_s3\\day21', 'G:\\python_s3', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Python35\\lib\\site-packages', 'D:\\Program Files (x64)\\pycharm軟件安裝\\config\\PyCharm 2018.3\\helpers\\pycharm_matplotlib_backend']因此若像我一樣在當(dāng)前目錄下存在與要引入模塊同名的文件,就會把要引入的模塊沒屏蔽掉。
2、from...import ...語句
from modname import name1[,name2[, ... nameN]]這個聲明不會把整個modulename模塊導(dǎo)入到當(dāng)前的命名空間中,只會講它里面的name1或name2單個引入到執(zhí)行這個聲明的模塊的全局符號表。?
3、from...import*語句
from modname import *4、運(yùn)行本質(zhì)
1、import test 2、from test import add無論1還是2,首先通過sys.path找到test.py,然后執(zhí)行test腳本,區(qū)別是1會將test這個變量名加載到名字空間,而2只會將add這個變量名加載進(jìn)來。
5、包(package)
1、如果不同的人編寫的模塊名相同怎么辦?為了避免模塊名沖突,Python又引入了按目錄來組織模塊的方法,成為包(Package)。 舉個例子:一個abc.py的文件就是一個名字叫abc的模塊,一個simon.py的文件就是一個叫simon的模塊。 現(xiàn)在,假設(shè)我們的abc和simon這兩個模塊名字和其他模塊起沖突了,于是我們可以通過包來組織模塊,從而避免沖突。方法就是選擇一個頂層包名:2、引入了包以后,只要頂層的包名不與別人沖突,那所有模塊都不會與別人沖突。現(xiàn)在,view.py模塊的名字就變成了hello_django.app01.views,類似的,manage.py的模塊名則是hello_django.manage。請注意,每一個包目錄下面都會有一個__init__.py的文件,這個文件是必須存在的,否則,Python就把這個目錄當(dāng)成普通目錄(文件夾),而不是一個包。__init__.py可以是空文件,也可以有Python代碼,因為__init__.py本身就是一個模塊,而它的模塊名就是對應(yīng)包的名字。注意點(important)
調(diào)用包就是執(zhí)行包下的__init__.py文件
#1-------------------------------- 在node1中import hello是找不到的,有人說可以找到呀,那是因為你的pycharm為你把myapp這一層路徑加入到了sys.path里面,所以可以找到,然而程序一旦在命令行運(yùn)行,則報錯。有同學(xué)問那怎么辦?簡單啊,自己把這個路徑加進(jìn)去不就OK啦:import sys,os BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) #臨時修改 import hello hello.hello1() #2、-------------- if __name__=='__main__':print('ok')“Make a .py both importable and executable”
如果我們是直接執(zhí)行某個.py文件的時候,該文件中那么"__name__ == '__main__' "是True,但是我們?nèi)绻麖牧硗庖粋€.py文件通過import導(dǎo)入該文件的時候,這時__name__的值就是我們這個py文件的名字而不是__main__.
這個功能還有一個用處:調(diào)試代碼的時候,在"if __name__ == '__main__' "中加入一些我們的調(diào)試代碼,我們可以讓外部模塊調(diào)用的時候不執(zhí)行我們的調(diào)試代碼,但是如果我們想排查問題的時候,直接執(zhí)行該模塊文件,調(diào)試代碼能夠正常運(yùn)行!
##-------------cal.py def add(x,y):return x+y ##-------------main.py import cal #from module import caldef main():cal.add(1,2)##--------------bin.py from module import mainmain.main()注意:
?
# from module import cal 改成 from . import cal同樣可以,這是因為bin.py是我們的執(zhí)行腳本, # sys.path里有bin.py的當(dāng)前環(huán)境。即/Users/simon/Desktop/whaterver/project/web這層路徑, # 無論import what , 解釋器都會按這個路徑找。所以當(dāng)執(zhí)行到main.py時,import cal會找不到,因為 # sys.path里沒有/Users/simon/Desktop/whaterver/project/web/module這個路徑,而 # from module/. import cal 時,解釋器就可以找到了。三、time模塊(* * * *)
三種時間表示
在Python中,通常有這幾種方式來表達(dá)時間: 1、時間戳(timestamp):通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運(yùn)行“type(time.time())”,返回的是float類型。 2、格式化的時間字符串 3、元祖(struct_time):struct_time元祖共有9個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時) import time#1、time(): 返回當(dāng)前時間的時間戳 print(time.time())運(yùn)行結(jié)果如下: C:\Python35\python3.exe G:/python_s3/day21/example.py 1555996405.5020845#2、localtime(secs): 將一個時間戳轉(zhuǎn)換為當(dāng)前時區(qū)的struct_time。secs參數(shù)未提供,則以當(dāng)前時間為準(zhǔn)。 print(time.localtime())運(yùn)行結(jié)果如下: C:\Python35\python3.exe G:/python_s3/day21/example.py time.struct_time(tm_year=2019, tm_mon=4, tm_mday=23, tm_hour=13, tm_min=18, tm_sec=9, tm_wday=1, tm_yday=113, tm_isdst=0) #3、gmtime([secs])和localtime()方法類似,gmtime()方法是將一個時間戳轉(zhuǎn)換為UTC時區(qū)(0時區(qū))的struct_time。 print(time.gmtime()) 運(yùn)行結(jié)果如下: C:\Python35\python3.exe G:/python_s3/day21/example.py time.struct_time(tm_year=2019, tm_mon=4, tm_mday=23, tm_hour=5, tm_min=21, tm_sec=25, tm_wday=1, tm_yday=113, tm_isdst=0) #4、mktime(t): 將一個struct_time轉(zhuǎn)化為時間戳 print(time.mktime(time.localtime())) # 運(yùn)行結(jié)果如下: C:\Python35\python3.exe G:/python_s3/day21/example.py 1555998160.0 #5、asctime([t]): 把一個表示時間的元祖或者struct_time表示為這種形式:'Tue Apr 23 13:45:49 2019' #如果沒有參數(shù),將會將time.localtime()作為參數(shù)傳入。 print(time.asctime()) 運(yùn)行結(jié)果如下: C:\Python35\python3.exe G:/python_s3/day21/example.py Tue Apr 23 13:45:49 2019 #6、ctime([secs]): 把一個時間戳(按秒計算的浮點數(shù))轉(zhuǎn)化為time.asctime()的形式。如果參數(shù)未給或者為None的時候,將會默認(rèn)time.time()為參數(shù)。它的作用相當(dāng)于time.asctime(time.localtime(secs))。 print(time.ctime()) #Tue Apr 23 14:02:45 2019 print(time.ctime(time.time())) #Tue Apr 23 14:03:50 2019 #7、strftime(format[,t]) #把一個代表時間的元祖或者struct_time(如由time.localtime()和time.gmtime()返回) 轉(zhuǎn)化為格式化的時間字符串。如果t未指定,將傳入time.localtime()。如果元組中任何一個元素過界,ValueError的錯誤將會被拋出。 print(time.strftime("%Y-%m-%d %X",time.localtime())) #2019-04-23 14:11:12 #8、time.strptime(string[, format]) #把一個格式化時間字符串轉(zhuǎn)化為struct_time。實際上它和strftime()是逆操作。 print(time.strptime('2019-04-23 14:15:07', '%Y-%m-%d %X')) 輸出結(jié)果為: time.struct_time(tm_year=2019, tm_mon=4, tm_mday=23, tm_hour=14, tm_min=15, tm_sec=7, tm_wday=1, tm_yday=113, tm_isdst=-1) #在這個函數(shù)中,format默認(rèn)為:"%a %b %d %H:%M:%S %Y"。 #9、sleep(sesc) print(time.sleep(3)) #線程推遲指定的時間運(yùn)行,單位為秒。 #10、clock # 這個需要注意,在不同的系統(tǒng)上含義不同。在UNIX系統(tǒng)上,它返回的是"進(jìn)程時間",它是用秒表示的浮點數(shù)(時間戳)。而在windows中,第一次調(diào)用,返回的是進(jìn)程運(yùn)行的實際時間。而第二次之后的調(diào)用是自第一次調(diào)用以后到現(xiàn)在的運(yùn)行時間,即兩次時間差。關(guān)系圖:
四、random模塊(* *)
import randomret=random.random() # ret=random.randint(1,3) #[1,3] # ret=random.randrange(1,3) #[1,3] # ret=random.choice([11,22,33,44,55]) # ret=random.sample([11,22,33,44,55],2) # ret=random.uniform(1,4) # print(ret) # ret=[1,2,3,4,5] # random.shuffle(ret) # print(ret)item=[1,3,5,7,9] random.shuffle(item) print(item)#隨機(jī)生成驗證碼
import random def v_code():ret=""for i in range(5):num=random.randint(0,9)alf=chr(random.randint(65,122))s=str(random.choice([num,alf])) ret+=s return ret print(v_code())五、os模塊(* *?* *)
os模塊是與操作系統(tǒng)交互的接口
os.getcwd() #獲取當(dāng)前工作目錄,即當(dāng)前python腳本的目錄路徑os.chdir("dirname") #改變當(dāng)前腳本工作目錄,相當(dāng)于shell下cdos.cudir #返回當(dāng)前目錄:(' . ')os.pardir #獲取當(dāng)前目錄的父目錄字符串名:(' . . ')os.makedirs('dirname1/dirname2') #可生成多層遞歸目錄os.removedirs('dirname1') #若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,依此類推os.mkdir('dirname') #生成單級目錄,相當(dāng)于linux中mkdir dirname os.rmdir('dirname') #刪除單級空目錄,若目錄不為空則無法刪除,報錯,相當(dāng)于shell中rmdir dirname os.listdir('dirname') #列出指定目錄下的所有文件和子目錄,包含隱藏文件,并以列表的方式打印 os.remove() #刪除一個文件 os.rename("oldname","newname") #重命名文件/目錄 os.stat('path/filename') #獲取文件/目錄信息 例: print(os.stat("sss.py")) C:\Python35\python3.exe G:/python_s3/day22/os_test.py os.stat_result(st_mode=33206, st_ino=11821949021847676, st_dev=2159804260, st_nlink=1, st_uid=0, st_gid=0, st_size=10, st_atime=1556025329, st_mtime=1556025329, st_ctime=1556025302) os.sep #輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep #輸出當(dāng)前平臺使用的行終止符,win下為"\r\n",Linux下為"\n" os.pathsep #輸出用于分隔文件路徑的字符 win下為; ,Linux下為: os.name #輸出字符串指示當(dāng)前使用平臺。win-->'nt'; Linux-->'posix' os.system("bash command") #運(yùn)行shell命令,直接顯示 os.environ #獲取系統(tǒng)環(huán)境變量 例: print(os.environ) environ({'FP_NO_HOST_CHECK': 'NO', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM': 'D:\\Program Files (x64)\\pycharm軟件安裝\\config\\PyCharm 2018.3\\bin;', 'COMPUTERNAME': 'DELL-PC', 'PYTHONPATH': 'G:\\python_s3;D:\\Program Files (x64)\\pycharm軟件安裝\\config\\PyCharm 2018.3\\helpers\\pycharm_matplotlib_backend', 'PYCHARM_HOSTED': '1', 'PYCHARM_MATPLOTLIB_PORT' os.path.abspath(path) #返回path規(guī)范化的絕對路徑 os.path.split(path) #將path分割成目錄和文件名二元組返回 例: print(os.path.split(r"G:\python_s3\day22\sss.py")) 輸出結(jié)果: ('G:\\python_s3\\day22', 'sss.py') os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素 例: print(os.path.dirname(r"G:\python_s3\day22\sss.py")) 輸出結(jié)果: G:\python_s3\day22 os.path.basename(path) #返回path最后的文件名,如果path以/ 或 \結(jié)尾,那么就會返回空值。即os.path.split(path) 的第二個元素 例: print(os.path.basename(r"G:\python_s3\day22\sss.py")) 輸出結(jié)果: sss.py os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) #如果path是絕對路徑,返回True os.path.isfile(path) #如果path是一個存在的文件,返回True,否則返回False os.path.isdir(path) #如果path是一個存在的目錄,則返回True,否則返回False os.path.join(path1,paht2[, ...]) #將多個路徑組合后返回,第一個絕對路徑之前的參數(shù)將被忽略 例: a="G:\python_s3\day22" b="sss.py" print(os.path.join(a,b)) 輸出結(jié)果: G:\python_s3\day22\sss.py os.path.getatime(paht) #返回path所指向的文件或者目錄的最后存取時間 os.path.getmtime(path) #返回path所指向的文件或者目錄的最后修改時間六、sys模塊(*?* *)
#1、sys.argv 命令行參數(shù)List,第一個元素是程序本身路徑 #2、sys.exit(n) 退出程序,正常退出時exit(0) #3、sys.version 獲取Python解釋程序的版本信息 #4、sys.maxint 最大的Int值 #5、sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值 #6、sys.platform 返回操作系統(tǒng)平臺名稱#7、sys.stdout.write("please:") #標(biāo)準(zhǔn)輸出,引出進(jìn)度條的例子,注意,在py3上不行,可以用print代替
#8、sys.stdout.flush() #刷新緩存 ##進(jìn)度條 import time,sys for i in range(10):sys.stdout.write('#')time.sleep(1)sys.stdout.flush()輸出結(jié)果: C:\Python35\python3.exe G:/python_s3/day22/sys_test.py ##########
七、json&pickle模塊(*?* *?*)
之前我們學(xué)習(xí)過用eval內(nèi)置方法可以將一個字符串轉(zhuǎn)成python對象,不過,eval方法是有局限性的,對于普通的數(shù)據(jù)類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就不管用了,所以eval的重點還是通常用來執(zhí)行一個字符串表達(dá)式,并返回表達(dá)式的值。
?用于序列化的兩個模塊
●?json,用于任何語言 和 python數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換
● pickle,用于python特有的類型 和 python的數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換
dic='{"name":"simon"}' f=open('hello','w') f.write(dic)f_read=open('hello','r') data=f_read.read() print(type(data)) #讀到的文件內(nèi)容是字符串<class 'str'> data=eval(data) #將字符串轉(zhuǎn)成字典 print(data['name']) #讀取字典name對應(yīng)的值輸出結(jié)果為: C:\Python35\python3.exe G:/python_s3/day22/json&pickle.py <class 'str'> simon1、什么是序列化?
我們把對象(變量)從內(nèi)存中變成可儲存或傳輸?shù)倪^程稱之為序列化,在Python中叫pickling,在其他語言中也稱之為serialization,marshalling,flattening等。
序列化之后,就可以把序列化后的內(nèi)容寫到磁盤,或者通過網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。
反過來,把變量內(nèi)容從序列化的對象重新讀到內(nèi)存里稱之為反序列化,即unpicking。
2、json
如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標(biāo)準(zhǔn)格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便的存儲到磁盤或者通過網(wǎng)絡(luò)傳輸。JSON不僅是標(biāo)準(zhǔn)格式,并且比XML更快,而且可以直接在Web頁面中讀取,非常方便。
JSON表示的對象就是標(biāo)準(zhǔn)的JavaScript語言的對象,JSON和Python內(nèi)置的數(shù)據(jù)類型對應(yīng)如下:
| JSON類型 | Python類型 |
| {} | dict |
| [] | list |
| "string" | str |
| 1234.56 | int或float |
| true/false | True/False |
| null | None |
3、pickle
#--------------------pickle------------------ import pickledic={'name':'william','age':24,'sex':'male'} print(type(dic)) #<class 'dict'>j=pickle.dumps(dic) print(type(j)) #<class 'bytes'>f = open('序列化對象_pickle','wb') #注意是w是寫入str,wb是寫入bytes,j是'bytes' f.write(j) #------------------------等價于pickle.dump(dic,f) # pickle.dump(dic,f) f.close() #----------------------------反序列化 f = open('序列化對象_pickle','rb') data = pickle.loads(f.read()) #等價于data=pickle.load(f) print(data['age']) #24pickle的問題和所有其他編程語言特有的序列化問題一樣,就是它只能用于Python,并且不同于其他版本的python彼此版本不兼容,因此,只能用pickle保存那些不重要的數(shù)據(jù),不能成功地反序列化也沒關(guān)系。
八、shelve模塊(*?* *)
import shelvef = shelve.open(r'shelve') #目的:將一個字典放入文本 f={}# f['stu1_info']={'name':'simon','age':'18'} # f['stu2_info']={'name':'simonn','age':'20'} # f['school_info']={'website':'baidu.com','city':'beijing'} # # # f.close()print(f.get('stu1_info')['age']) #18九、xml模塊(*?* *)
xml是實現(xiàn)不同語言或程序之間進(jìn)行數(shù)據(jù)交換的協(xié)議,跟json差不多,但json使用起來更簡單,不過,古時候,在json還沒誕生的黑暗年代,大家只能選擇用xml呀,至今很多傳統(tǒng)公司如金融行業(yè)的很多系統(tǒng)的接口還主要是xml。
xml的格式如下,就是通過<>節(jié)點來區(qū)別數(shù)據(jù)結(jié)構(gòu)的:
<?xml version="1.0"?> <data><country name="Liechtenstein"><rank updated="yes">2</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country><country name="Singapore"><rank updated="yes">5</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank updated="yes">69</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country> </data>xml數(shù)據(jù)xml協(xié)議在各個語言里的都 是支持的,在python中可以用以下模塊操作xml:
import xml.etree.ElementTree as ETtree = ET.parse("xmltest.xml") root = tree.getroot() print(root.tag)#遍歷xml文檔 for child in root:print(child.tag, child.attrib) for i in child: print(i.tag,i.text) #只遍歷year 節(jié)點 for node in root.iter('year'): print(node.tag,node.text) #--------------------------------------- import xml.etree.ElementTree as ET tree = ET.parse("xmltest.xml") root = tree.getroot() #修改 for node in root.iter('year'): new_year = int(node.text) + 1 node.text = str(new_year) node.set("updated","yes") tree.write("xmltest.xml") #刪除node for country in root.findall('country'): rank = int(country.find('rank').text) if rank > 50: root.remove(country) tree.write('output.xml')自己創(chuàng)建xml文檔:
import xml.etree.ElementTree as ETnew_xml = ET.Element("namelist") name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) age = ET.SubElement(name,"age",attrib={"checked":"no"}) sex = ET.SubElement(name,"sex") sex.text = '33' name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"}) age = ET.SubElement(name2,"age") age.text = '19' et = ET.ElementTree(new_xml) #生成文檔對象 et.write("test.xml", encoding="utf-8",xml_declaration=True) ET.dump(new_xml) #打印生成的格式十、re模塊(*?* *?* *)
1、什么是正則?
正則就是用一些具有特殊含義的符號組合到一起(稱為正則表達(dá)式)來描述字符或者字符串的方法。或者說:正則就是用來描述一類事物的規(guī)則。(在python中)它內(nèi)嵌在Python中,并通過re模塊實現(xiàn)。正則表達(dá)式模式被編譯成一系列的字節(jié)碼,然后由用C編寫的匹配引擎執(zhí)行。
?字符匹配(普通字符,元字符):
1、普通字符:大多數(shù)字符和字母都會和自身匹配
>>> re.findall("zhurui","FREWRFVZHURzhuruiSIMONsimon")
['zhurui']
>>>
?2、元字符:. ^ $ * + ? {} [] | () \
1、元字符之(? . ^ $ * + ? { }??)
import re ret=re.findall('si..n','qwerwrsimonreorerge') #['simon'] print(ret)ret=re.findall('^s...n','simonreorserpnerge') #['simon'] print(ret)ret=re.findall('s...n','simonreorserpnerge') #['simon', 'serpn'] print(ret)ret=re.findall('s...n$','simonreorserpnergesrren') #['srren'] print(ret)ret=re.findall('^s*','sssasdfgdsjjuresssss') #['sss'],*:表示0到無窮次 +:表示1到無窮次 print(ret) ret=re.findall('alex*','asdfhfalexxx') # print(ret) #['alexxx'] ret=re.findall('alex+','asdfhfalexxx') #[1,+oo] print(ret) #['alexxx'] ret=re.findall('alex*','asdfhfale') #['ale'] print(ret) ret=re.findall('alex+','asdfhfale') #[] print(ret) ret=re.findall('simon?','asdhfsimonnn') #[0,1],?:表示匹配0到1個 print(ret) #['simon'] ret=re.findall('simon{1,3}','asdhfsimonnnnnn') #['simonnn'] 貪婪匹配 print(ret)注意:前面*,+,?等都是貪婪匹配,也就是盡可能多匹配,后面加?號使其變成惰性匹配
ret=re.findall('abc*?','abcccccc') print(ret) #['ab']2、元字符之字符集[? ?]:
##---------------------------字符集[] ret=re.findall('www[simon baidu]','wwwbaidu') print(ret)ret=re.findall('x[yz]','xyuuuu') print(ret)ret=re.findall('x[yz]','xyuuxzuu') #['xy', 'xz'] print(ret)ret=re.findall('x[yz]p','xypuuxzpuu') #['xyp', 'xzp'] print(ret) ret=re.findall('x[y,z]p','xypuuxzpux,pu') #['xyp', 'xzp', 'x,p'] print(ret) ret=re.findall('q[a*z]','xypuuxzpqaa') #['qa'] print(ret) ret=re.findall('q[a-z]*','quouuiuni') #['quouuiuni'] print(ret) ret=re.findall('q[a-z]*','quouuiuni9') #['quouuiuni'] print(ret) ret=re.findall('q[0-9]*','q8910uouuiuni9') #['q8910'] print(ret) ret=re.findall('q[0-9]*','q8910uouuiuniq9') #['q8910', 'q9'] print(ret) ret=re.findall('q[^a-z]*','q821') #['q821'] print(ret)3、元字符之轉(zhuǎn)義符\
反斜杠后邊跟元字符去除特殊功能,比如\.
反斜杠后邊跟普通字符實現(xiàn)特殊功能,比如\d
4、元字符之分組()
m = re.findall(r'(ad)+','add') print(m)ret=re.search('(?P<id>\d{2})/(?P<name>\w{3})','23/com') print(ret.group()) # 23/com print(ret.group('id')) #23ret=re.search("(?P<name>[a-z]+)\d+","123simon27zhurui24william45").group() print(ret) #simon27ret=re.search("(?P<name>[a-z]+)\d+","123simon27zhurui24william45").group('name') print(ret) #simon ret=re.search("(?P<name>[a-z]+)(?P<age>\d+)","123simon27zhurui24william45").group('age') #.group是固定格式 print(ret) #275、元字符之 |
ret=re.search('(ab)|\d','rabhdg8sdgrui') #ab print(ret.group())6、re模塊下的常用方法
import re#方法1 print(re.findall("s","simon zhu")) #['s'],返回所有滿足匹配條件的結(jié)果,放在列表里#方法2 ret=re.search("(?P<name>[a-z]+)(?P<age>\d+)","123simon27zhurui24william45").group('age') #函數(shù)會在字符串內(nèi)查找模式匹配,只找到第一個匹配然后返回一個包含匹配信息的對象,該對象可以通過調(diào)用group()方法得到匹配的字符串,如果字符串沒有匹配,則返回None print(ret) #27#方法3 print(re.match("\d+","23simon24zhurui23will78")) #同search,不過盡在字符串開始處進(jìn)行匹配#方法4 ret=re.split("[ab]","abcd") #先按'a'分割得到' ' 和'bcd',在對' '和'bcd'分別按'b'分割 print(ret) #['', '', 'cd']#方法5ret=re.sub('\d','abc','simon7zhurui9',1) print(ret) #simonabczhurui9ret=re.subn('\d','abc','alvin5yuan6') print(ret)#('alvinabcyuanabc', 2)#方法6 obj=re.compile('\d{3}') ret=obj.search('abc123eeee') print(ret.group())#123 ret=re.finditer('\d','ds3sy4784a') print(ret) #<callable_iterator object at 0x10195f940> print(next(ret).group()) print(next(ret).group())注意:
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com') print(ret)#['oldboy'] 這是因為findall會優(yōu)先把匹配結(jié)果組里內(nèi)容返回,如果想要匹配結(jié)果,取消權(quán)限即可ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com') print(ret)#['www.oldboy.com']ret=re.findall("www\.(baidu|163)\.com","fddsfsfdwww.baidu.comrerggetbbvfd") print(ret) #['baidu']ret=re.findall("www\.(?:baidu|163)\.com","fddsfsfdwww.baidu.comrerggetbbvfd") print(ret) #['www.baidu.com']補(bǔ)充:
import reprint(re.findall("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")) print(re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")) print(re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>"))補(bǔ)充2:
#匹配出所有的整數(shù) import re#ret=re.findall(r"\d+{0}]","1-2*(60+(-40.35/5)-(-4*3))") ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove("")print(ret)?
轉(zhuǎn)載于:https://www.cnblogs.com/hackerer/p/10753752.html
總結(jié)
以上是生活随笔為你收集整理的Python之路【第八篇】:Python模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Servlet,GenericServl
- 下一篇: 网络安装Centos x64 6.10