模塊,用一砣代碼實(shí)現(xiàn)了某個(gè)功能的代碼集合。 類(lèi)似于函數(shù)式編程和面向過(guò)程編程,函數(shù)式編程則完成一個(gè)功能,其他代碼用來(lái)調(diào)用即可,提供了代碼的重用性和代碼間的耦合。而對(duì)于一個(gè)復(fù)雜的功能來(lái),可能需要多個(gè)函數(shù)才能完成(函數(shù)又可以在不同的.py文件中),n個(gè) .py 文件組成的代碼集合就稱(chēng)為模塊。 如:os 是系統(tǒng)相關(guān)的模塊;file是文件操作相關(guān)的模塊 模塊分為三種: 自定義模塊1、定義模塊 情景一:  情景二:  情景三:  2、導(dǎo)入模塊 Python之所以應(yīng)用越來(lái)越廣泛,在一定程度上也依賴(lài)于其為程序員提供了大量的模塊以供使用,如果想要使用模塊,則需要導(dǎo)入。導(dǎo)入模塊有一下幾種方法:
1
2
3
4
|
import module
from module.xx.xx import xx
from module.xx.xx import xx as rename
from module.xx.xx import *
|
導(dǎo)入模塊其實(shí)就是告訴Python解釋器去解釋那個(gè)py文件 那么問(wèn)題來(lái)了,導(dǎo)入模塊時(shí)是根據(jù)那個(gè)路徑作為基準(zhǔn)來(lái)進(jìn)行的呢?即:sys.path
1
2
3
4
5
|
import sys
print sys.path
結(jié)果:
['/Users/wupeiqi/PycharmProjects/calculator/p1/pp1', '/usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg', '/usr/local/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg', '/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/xlutils-1.7.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages/xlwt-1.0.0-py2.7.egg', '/usr/local/lib/python2.7/site-packages/xlrd-0.9.3-py2.7.egg', '/usr/local/lib/python2.7/site-packages/tornado-4.1-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg', '/usr/local/lib/python2.7/site-packages/certifi-2015.4.28-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pyOpenSSL-0.15.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages/six-1.9.0-py2.7.egg', '/usr/local/lib/python2.7/site-packages/cryptography-0.9.1-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/cffi-1.1.1-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/ipaddress-1.0.7-py2.7.egg', '/usr/local/lib/python2.7/site-packages/enum34-1.0.4-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg', '/usr/local/lib/python2.7/site-packages/idna-2.0-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pycparser-2.13-py2.7.egg', '/usr/local/lib/python2.7/site-packages/Django-1.7.8-py2.7.egg', '/usr/local/lib/python2.7/site-packages/paramiko-1.10.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/greenlet-0.4.7-py2.7-macosx-10.10-x86_64.egg', '/Users/wupeiqi/PycharmProjects/calculator', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages', '/Library/Python/2.7/site-packages']
|
如果sys.path路徑列表沒(méi)有你想要的路徑,可以通過(guò) sys.path.append('路徑') 添加。 通過(guò)os模塊可以獲取各種目錄,例如: pre_path = os.path.abspath('../') sys.path.append(pre_path)
開(kāi)源模塊一、下載安裝 下載安裝有兩種方式: yum
pip
apt-get
...
下載源碼 解壓源碼
進(jìn)入目錄
編譯源碼 python setup.py build
安裝源碼 python setup.py install
注:在使用源碼安裝時(shí),需要使用到gcc編譯和python開(kāi)發(fā)環(huán)境,所以,需要先執(zhí)行:
1
2
3
4
|
yum install gcc
yum install python-devel
或
apt-get python-dev
|
安裝成功后,模塊會(huì)自動(dòng)安裝到 sys.path 中的某個(gè)目錄中,如:
1
|
/usr/lib/python2.7/site-packages/
|
二、導(dǎo)入模塊 同自定義模塊中導(dǎo)入的方式 三、模塊 paramiko paramiko是一個(gè)用于做遠(yuǎn)程控制的模塊,使用該模塊可以對(duì)遠(yuǎn)程服務(wù)器進(jìn)行命令或文件操作,值得一說(shuō)的是,fabric和ansible內(nèi)部的遠(yuǎn)程管理就是使用的paramiko來(lái)現(xiàn)實(shí)。 1、下載安裝 或
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# pycrypto,由于 paramiko 模塊內(nèi)部依賴(lài)pycrypto,所以先下載安裝pycrypto
# 下載安裝 pycrypto
wget http://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz
tar -xvf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py build
python setup.py install
# 進(jìn)入 python 環(huán)境,導(dǎo)入 Crypto 檢查是否安裝成功
# 下載安裝 paramiko
wget http://files.cnblogs.com/files/wupeiqi/paramiko-1.10.1.tar.gz
tar -xvf paramiko-1.10.1.tar.gz
cd paramiko-1.10.1
python setup.py build
python setup.py install
# 進(jìn)入python環(huán)境,導(dǎo)入paramiko檢查是否安裝成功
|
2、使用模塊 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') private_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('主機(jī)名 ', 端口, '用戶(hù)名', key) stdin, stdout, stderr = ssh.exec_command('df') t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test.py','/tmp/test.py') t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test.py','/tmp/test2.py') pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test3.py','/tmp/test3.py') pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test3.py','/tmp/test4.py')
內(nèi)置模塊一、os 用于提供系統(tǒng)級(jí)別的操作 os.getcwd() 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑 os.chdir("dirname") 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cd os.curdir 返回當(dāng)前目錄: ('.') os.pardir 獲取當(dāng)前目錄的父目錄字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,則刪除,依此類(lèi)推 os.mkdir('dirname') 生成單級(jí)目錄;相當(dāng)于shell中mkdir dirname os.rmdir('dirname') 刪除單級(jí)空目錄,若目錄不為空則無(wú)法刪除,報(bào)錯(cuò);相當(dāng)于shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.sep 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep 輸出當(dāng)前平臺(tái)使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep 輸出用于分割文件路徑的字符串 os.name 輸出字符串指示當(dāng)前使用平臺(tái)。win->'nt'; Linux->'posix' os.system("bash command") 運(yùn)行shell命令,直接顯示 os.environ 獲取系統(tǒng)環(huán)境變量 os.path.abspath(path) 返回path規(guī)范化的絕對(duì)路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實(shí)就是os.path.split(path)的第一個(gè)元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結(jié)尾,那么就會(huì)返回空值。即os.path.split(path)的第二個(gè)元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對(duì)路徑,返回True os.path.isfile(path) 如果path是一個(gè)存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個(gè)存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個(gè)路徑組合后返回,第一個(gè)絕對(duì)路徑之前的參數(shù)將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最后存取時(shí)間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時(shí)間
二、sys 用于提供對(duì)解釋器相關(guān)的操作 sys.argv 命令行參數(shù)List,第一個(gè)元素是程序本身路徑 sys.exit(n) 退出程序,正常退出時(shí)exit(0) sys.version 獲取Python解釋程序的版本信息 sys.path 返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值 sys.platform 返回操作系統(tǒng)平臺(tái)名稱(chēng) sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
更多猛擊這里 三、hashlib 用于加密相關(guān)的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import hashlib
# ######## md5 ########
hash = hashlib.md5()
hash.update('admin')
print hash.hexdigest()
# ######## sha1 ########
hash = hashlib.sha1()
hash.update('admin')
print hash.hexdigest()
# ######## sha256 ########
hash = hashlib.sha256()
hash.update('admin')
print hash.hexdigest()
# ######## sha384 ########
hash = hashlib.sha384()
hash.update('admin')
print hash.hexdigest()
# ######## sha512 ########
hash = hashlib.sha512()
hash.update('admin')
print hash.hexdigest()
|
以上加密算法雖然依然非常厲害,但時(shí)候存在缺陷,即:通過(guò)撞庫(kù)可以反解。所以,有必要對(duì)加密算法中添加自定義key再來(lái)做加密。
1
2
3
4
5
6
7
|
import hashlib
# ######## md5 ########
hash = hashlib.md5('898oaFs09f')
hash.update('admin')
print hash.hexdigest()
|
還不夠吊?python 還有一個(gè) hmac 模塊,它內(nèi)部對(duì)我們創(chuàng)建 key 和 內(nèi)容 再進(jìn)行處理然后再加密
1
2
3
4
|
import hmac
h = hmac.new('wueiqi')
h.update('hellowo')
print h.hexdigest()
|
不能再牛逼了?。。?/p> 四、json 和 pickle 用于序列化的兩個(gè)模塊 Json模塊提供了四個(gè)功能:dumps、dump、loads、load pickle模塊提供了四個(gè)功能:dumps、dump、loads、load 五、執(zhí)行系統(tǒng)命令 可以執(zhí)行shell命令的相關(guān)模塊和函數(shù)有: os.system os.spawn* os.popen* --廢棄 popen2.* --廢棄 commands.* --廢棄,3.x中被移除
import commands result = commands.getoutput('cmd')
result = commands.getstatus('cmd')
result = commands.getstatusoutput('cmd')
以上執(zhí)行shell命令的相關(guān)的模塊和函數(shù)的功能均在 subprocess 模塊中實(shí)現(xiàn),并提供了更豐富的功能。 call 執(zhí)行命令,返回狀態(tài)碼
1
2
|
ret = subprocess.call(["ls", "-l"], shell=False)
ret = subprocess.call("ls -l", shell=True)
|
shell = True ,允許 shell 命令是字符串形式 check_call 執(zhí)行命令,如果執(zhí)行狀態(tài)碼是 0 ,則返回0,否則拋異常
1
2
|
subprocess.check_call(["ls", "-l"])
subprocess.check_call("exit 1", shell=True)
|
check_output 執(zhí)行命令,如果狀態(tài)碼是 0 ,則返回執(zhí)行結(jié)果,否則拋異常
1
2
|
subprocess.check_output(["echo", "Hello World!"])
subprocess.check_output("exit 1", shell=True)
|
subprocess.Popen(...) 用于執(zhí)行復(fù)雜的系統(tǒng)命令 參數(shù): args:shell命令,可以是字符串或者序列類(lèi)型(如:list,元組) bufsize:指定緩沖。0 無(wú)緩沖,1 行緩沖,其他 緩沖區(qū)大小,負(fù)值 系統(tǒng)緩沖 stdin, stdout, stderr:分別表示程序的標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤句柄 preexec_fn:只在Unix平臺(tái)下有效,用于指定一個(gè)可執(zhí)行對(duì)象(callable object),它將在子進(jìn)程運(yùn)行之前被調(diào)用 close_sfs:在windows平臺(tái)下,如果close_fds被設(shè)置為T(mén)rue,則新創(chuàng)建的子進(jìn)程將不會(huì)繼承父進(jìn)程的輸入、輸出、錯(cuò)誤管道。
所以不能將close_fds設(shè)置為T(mén)rue同時(shí)重定向子進(jìn)程的標(biāo)準(zhǔn)輸入、輸出與錯(cuò)誤(stdin, stdout, stderr)。 shell:同上 cwd:用于設(shè)置子進(jìn)程的當(dāng)前目錄 env:用于指定子進(jìn)程的環(huán)境變量。如果env = None,子進(jìn)程的環(huán)境變量將從父進(jìn)程中繼承。 universal_newlines:不同系統(tǒng)的換行符不同,True -> 同意使用 \n startupinfo與createionflags只在windows下有效
將被傳遞給底層的CreateProcess()函數(shù),用于設(shè)置子進(jìn)程的一些屬性,如:主窗口的外觀(guān),進(jìn)程的優(yōu)先級(jí)等等
終端輸入的命令分為兩種: obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',) obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) obj.stdin.write('print 1 \n ') obj.stdin.write('print 2 \n ') obj.stdin.write('print 3 \n ') obj.stdin.write('print 4 \n ') cmd_out = obj.stdout.read() cmd_error = obj.stderr.read() obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) obj.stdin.write('print 1 \n ') obj.stdin.write('print 2 \n ') obj.stdin.write('print 3 \n ') obj.stdin.write('print 4 \n ') out_error_list = obj.communicate() obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out_error_list = obj.communicate('print "hello"')
六、shutil 高級(jí)的 文件、文件夾、壓縮包 處理模塊 shutil.copyfileobj(fsrc, fdst[, length]) 將文件內(nèi)容拷貝到另一個(gè)文件中,可以部分內(nèi)容 shutil.copyfile(src, dst) shutil.copymode(src, dst) 僅拷貝權(quán)限。內(nèi)容、組、用戶(hù)均不變 shutil.copystat(src, dst) 拷貝狀態(tài)的信息,包括:mode bits, atime, mtime, flags shutil.ignore_patterns(*patterns) shutil.copytree(src, dst, symlinks=False, ignore=None) 例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*')) shutil.rmtree(path[, ignore_errors[, onerror]]) shutil.make_archive(base_name, format,...)
創(chuàng)建壓縮包并返回文件路徑,例如:zip、tar base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時(shí),則保存至當(dāng)前目錄,否則保存至指定路徑,
如:www =>保存至當(dāng)前路徑
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/ format: 壓縮包種類(lèi),“zip”, “tar”, “bztar”,“gztar” root_dir: 要壓縮的文件夾路徑(默認(rèn)當(dāng)前目錄) owner: 用戶(hù),默認(rèn)當(dāng)前用戶(hù) group: 組,默認(rèn)當(dāng)前組 logger: 用于記錄日志,通常是logging.Logger對(duì)象
1
2
3
4
5
6
7
8
9
|
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當(dāng)前程序目錄
import shutil
ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目錄
import shutil
ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
|
shutil 對(duì)壓縮包的處理是調(diào)用 ZipFile 和 TarFile 兩個(gè)模塊來(lái)進(jìn)行的,詳細(xì): z = zipfile.ZipFile('laxi.zip', 'w') z = zipfile.ZipFile('laxi.zip', 'r') tar = tarfile.open('your.tar','w') tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip') tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip') tar = tarfile.open('your.tar','r') tar.extractall() # 可設(shè)置解壓地址
七、logging 用于便捷記錄日志且線(xiàn)程安全的模塊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import logging
logging.basicConfig(filename='log.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=10)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')
|
對(duì)于等級(jí):
1
2
3
4
5
6
7
8
|
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
|
只有大于當(dāng)前日志等級(jí)的操作才會(huì)被記錄。 對(duì)于格式,有如下屬性可是配置: 八、time 時(shí)間相關(guān)的操作,時(shí)間有三種表示方式: 時(shí)間戳 1970年1月1日之后的秒,即:time.time() 格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d') 結(jié)構(gòu)化時(shí)間 元組包含了:年、日、星期等... time.struct_time 即:time.localtime()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
print time.time()
print time.mktime(time.localtime())
print time.gmtime() #可加時(shí)間戳參數(shù)
print time.localtime() #可加時(shí)間戳參數(shù)
print time.strptime('2014-11-11', '%Y-%m-%d')
print time.strftime('%Y-%m-%d') #默認(rèn)當(dāng)前時(shí)間
print time.strftime('%Y-%m-%d',time.localtime()) #默認(rèn)當(dāng)前時(shí)間
print time.asctime()
print time.asctime(time.localtime())
print time.ctime(time.time())
import datetime
'''
datetime.date:表示日期的類(lèi)。常用的屬性有year, month, day
datetime.time:表示時(shí)間的類(lèi)。常用的屬性有hour, minute, second, microsecond
datetime.datetime:表示日期時(shí)間
datetime.timedelta:表示時(shí)間間隔,即兩個(gè)時(shí)間點(diǎn)之間的長(zhǎng)度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
print datetime.datetime.now()
print datetime.datetime.now() - datetime.timedelta(days=5)
|
九、re re模塊用于對(duì)python的正則表達(dá)式的操作。 字符: . 匹配除換行符以外的任意字符 \w 匹配字母或數(shù)字或下劃線(xiàn)或漢字 \s 匹配任意的空白符 \d 匹配數(shù)字 \b 匹配單詞的開(kāi)始或結(jié)束 ^ 匹配字符串的開(kāi)始 $ 匹配字符串的結(jié)束 次數(shù): * 重復(fù)零次或更多次 + 重復(fù)一次或更多次 ? 重復(fù)零次或一次 {n} 重復(fù)n次 {n,} 重復(fù)n次或更多次 {n,m} 重復(fù)n到m次 IP:
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
手機(jī)號(hào):
^1[3|4|5|8][0-9]\d{8}$
1、match(pattern, string, flags=0) 從起始位置開(kāi)始根據(jù)模型去字符串中匹配指定內(nèi)容,匹配單個(gè) obj = re.match('\d+', '123uuasf') I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
2、search(pattern, string, flags=0) 根據(jù)模型去字符串中匹配指定內(nèi)容,匹配單個(gè) import re
obj = re.search('\d+', 'u123uu888asf')
if obj:
3、group和groups a = "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group()
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0)
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1)
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)
print re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()
4、findall(pattern, string, flags=0) 上述兩中方式均用于匹配單值,即:只能匹配字符串中的一個(gè),如果想要匹配到字符串中所有符合條件的元素,則需要使用 findall。 import re
obj = re.findall('\d+', 'fa123uu888asf')
print obj
5、sub(pattern, repl, string, count=0, flags=0) 用于替換匹配的字符串 content = "123abc456"
new_content = re.sub('\d+', 'sb', content)
# new_content = re.sub('\d+', 'sb', content, 1)
print new_content
相比于str.replace功能更加強(qiáng)大 6、split(pattern, string, maxsplit=0, flags=0) 根據(jù)指定匹配進(jìn)行分組 content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'" new_content = re.split('\*', content) # new_content = re.split('\*', content, 1) content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'" new_content = re.split('[\+\-\*\/]+', content) # new_content = re.split('\*', content, 1) inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))' inpp = re.sub('\s*','',inpp) new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1)
相比于str.split更加強(qiáng)大 實(shí)例:計(jì)算器源碼 十、random 隨機(jī)數(shù)
1
2
3
4
|
mport random
print random.random()
print random.randint(1,2)
print random.randrange(1,10)
|
隨機(jī)驗(yàn)證碼實(shí)例:
1
2
3
4
5
6
7
8
9
10
|
import random
checkcode = ''
for i in range(4):
current = random.randrange(0,4)
if current != i:
temp = chr(random.randint(65,90))
else:
temp = random.randint(0,9)
checkcode += str(temp)
print checkcode
|
|