python模組之_正則 re_configparser_logging_hashlib
阿新 • • 發佈:2018-12-25
正則表示式的內容放在最下面了
configparser 模組:
#!/usr/bin/env python # coding:utf-8 import configparser # 專門用於操作配置檔案的模組 # config = configparser.ConfigParser() # 例項化物件 # # config["DEFAULT"] = {'ServerAliveInterval': '45', # 'Compression': 'yes', # 'CompressionLevel': '9'} # # config['bitbucket.org'] = {} # config['bitbucket.org']['User'] = 'hg' # # config['topsecret.server.com'] = {} # ts = config['topsecret.server.com'] # ts['Host Port'] = '50022' # mutates the parser # ts['ForwardX11'] = 'no' # same here # # config['DEFAULT']['ForwardX11'] = 'yes' # # with open('example.ini', 'w') as configfile: # config.write(configfile) config = configparser.ConfigParser() print(config.sections()) config.read('example.ini') # 讀取配置檔案 print(config.sections()) # ['bitbucket.org', 'topsecret.server.com'] print('DEFAULT' in config) # 判斷是否有鍵 print(config['DEFAULT']['FORwardx11']) ## 塊下的子鍵不區分大小寫 print(config['bitbucket.org']['User']) # DEFAULT 塊比較特殊,會在 for 遍歷時一起出來 # DEFAULT 作用是給所有的塊都能共用 for i in config['bitbucket.org']: print(i) print(config.options('bitbucket.org')) # 拿到鍵 print(config.items('bitbucket.org')) # 拿到鍵值對的元組 print(config.get('bitbucket.org', 'compression')) # 取bitbucket.org下的某值,DEFAULT下的值也算。 config.add_section("address") # 加個區塊 config.set("address", 'city', 'suzhou') # 增加行 config.remove_section("topsecret.server.com") # 刪除塊 config.remove_option("DEFAULT", "ForwardX11") # 刪除行 config.write(open("conf.cfg", 'w')) # 寫入檔案
logging 模組:
#!/usr/bin/env python # coding:utf-8 import logging ## 日誌操作模組 # -------------------------------logging.basicConfig 方式 # logging.basicConfig( # level=logging.DEBUG, # 改變了預設級別 # filename = "loggingtest.log", ## 寫入檔案 # filemode="a", # a 追加模式 w 覆蓋 # format="%(asctime)s %(filename)s[%(lineno)s] %(message)s", # 寫入時間 輸出message時的行號 內容 # ) # # ## 參考 https://www.cnblogs.com/yuanchenqi/articles/5732581.html # # logging.debug('debug...') # logging.info('info...') # logging.warning('warning...') # 預設只顯示此級往下 # logging.error('error.....') # logging.critical('critical......') # -------------------------------logger 物件方式 def logger(): logger = logging.getLogger() logger.setLevel("DEBUG") fh =logging.FileHandler("logtest.log") #輸出檔案 ch = logging.StreamHandler() #輸出螢幕 fm = logging.Formatter("%(asctime)s %(filename)s[%(lineno)s] %(message)s") fh.setFormatter(fm) ch.setFormatter(fm) logger.addHandler(fh) logger.addHandler(ch) return logger logger = logger() logger.debug("debug...") logger.info("info...") logger.warning("warning...") logger.error("error...") logger.critical("critical...") # logger = logging.getLogger("logger") ##根物件 # logger1 = logging.getLogger("logger1") # logger2 = logging.getLogger("logger1.sontree") ## 子物件 ## 如果子級和父級都有輸出動作,那麼子級的輸出動作會輸出2次 ## 解決方法是取消父級的輸出動作,只輸出子級。
hashlib
import hashlib ## 普通的加密,存在撞庫的危險 obj_a = hashlib.md5() obj_a.update("hello".encode("utf8")) # 5d41402abc4b2a76b9719d911017c592 print(obj_a.hexdigest()) obj_a.update("root".encode("utf8")) print(obj_a.hexdigest()) # e206121dbbe984f3bc6c6448846ed8cd 這一串實際上是基於前一次的原始字元之上的加密結果。 # obj_a.update("helloroot".encode("utf8")) # e206121dbbe984f3bc6c6448846ed8cd 等於helloroot # print(obj_a.hexdigest()) ## 加鹽的加密,降低撞庫的風險 # obj_b = hashlib.md5() # 5d41402abc4b2a76b9719d911017c592 obj_b = hashlib.md5('[email protected]'.encode('utf8')) obj_b.update("hello".encode("utf8")) # 042cd0078e14743b5da893388d095859 print(obj_b.hexdigest())
re模組:
#!/usr/bin/env python # coding:utf-8 ## 正則表示式,作用就是做模糊匹配, 快速匹配 ## 參考 https://www.cnblogs.com/yuanchenqi/articles/5732581.html import re lis = re.findall('\d+',"alex22jack33ran8sdsff100") print(lis) ## 元字元 . ^ $ * + ? {} [] | () \ # 點 . 是萬用字元 可以代替除了 \n 外的任意一個字元 print(re.findall("a..x","absxdfsasdxkklarsx")) # 尖角號 ^ 匹配只能以其開頭的。 print(re.findall("^a..x","absxdfsasdxkklarsx")) # 刀勒 $ 匹配只能以其結尾的。 print(re.findall("a..x$","absxdfsasdxkklarsx")) # 星 * 匹配的是0到無窮次, 加 + 匹配的是1到無窮次 # 貪婪匹配 print(re.findall("alex*","absxdfsalexxxdds")) print(re.findall("alex+","absxdfsalexxxdds")) print(re.findall("alex*","absxdfsaledds")) print(re.findall("alex+","absxdfsaledds")) # 問號 ? 匹配 1次或0次 print(re.findall("alex?","alebsxdfsalexxxdds")) ''' 大括號{} 可以靈活運用 {0,} == * {1,} == + {0,1} == ? {1,5} 必須至少1個,最多取到5個 {5} 必須至少5位才能匹配 ''' print(re.findall("alex{2}","alexbsxdfsalexxxxdds")) print(re.findall("alex{1,3}","alexbsxdfsalexxxxdds")) print(re.findall("alex*?","alexbsxdfsalexxxxdds")) # 後面加問號,變成惰性匹配 # 最重要的字符集 [] 方括號裡面是字符集,特殊符號 * + ? 不再特殊,而 - 表示連續 print(re.findall("a[bc]","abexbsxdfsacexxxaxdds")) # ab ac print(re.findall("a[bc]x","abexbsxdfsacxexxxaxdds")) # acx print(re.findall("a[b*]x","abexbsxdfsacxexxxa*xdds")) # a*x print(re.findall("a[a-z]","abexbsxdfsacxexxxa*xdds")) # ab ac print(re.findall("a[a-z]*","abe,xbsxdfsacxexxxa*xdds")) # abe acxexxxa print(re.findall("a[0-9]","ab8a7654cde")) # a7 print(re.findall("a[0-9]*","ab8a7654cde")) # a a7654 print(re.findall("a[^0-9]","ab8a7654cde")) # 邏輯非:不要0-9 print(re.findall("\([^()]*\)","12+(34*5+3-7*(3-1))")) # 得到 (3-1) print(re.findall("34\*5","12+(34*5+3-7*(3-1))")) # 星號被轉義 ''' 元字元之轉義符\ 反斜槓後邊跟元字元去除特殊功能,比如\. 反斜槓後邊跟普通字元實現特殊功能,比如\d \d 匹配任何十進位制數;它相當於類 [0-9]。 \D 匹配任何非數字字元;它相當於類 [^0-9]。 \s 匹配任何空白字元;它相當於類 [ \t\n\r\f\v]。 \S 匹配任何非空白字元;它相當於類 [^ \t\n\r\f\v]。 \w 匹配任何字母數字字元;它相當於類 [a-zA-Z0-9_]。 \W 匹配任何非字母數字字元;它相當於類 [^a-zA-Z0-9_] \b 匹配一個特殊字元邊界,比如空格 ,&,#等 ''' print(re.findall("\d","12+(34*5+3-7*(3-1))")) print(re.findall(r"I\b","Hello I am LI LIST")) print(re.findall(r"I\\c","Hello I am LI LI\cST")) ## 直譯器會識別一次, re也會識別一次。所以要多加一個\ print(re.findall(r"ka|bc","Hellbcoaskads")) ## bc ka print(re.findall("(abc)","abcabcabckkkabc")) # 得到四個abc print(re.findall("(abc)+","abcabcabckkkabc")) # 僅輸出分組裡的第一個 print(re.findall("(?:abc)+","abcabcabckkkabc")) # 取消分組優先順序 ''' re.findall是找到所有的,返回list, re.search是隻找一個, 返回物件 ''' print("-------------------------------------") print(re.search("\d+","asdf321kdfas23")) print(re.search("\d{5}","asdf321kdfas23")) print(re.search("\d+","asdf321kdfas23").group()) # group方法取得結果 print(re.search("(abc)","abcabcabc")) print(re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33")) ## 分組,組名name print(re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33").group("name")) # alex print(re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34xialv33").group("age")) # 36 print(re.match("\d+","666alex36wusir34xialv33"))##只在開頭匹配,返回物件 print(re.match("\d+","666alex36wusir34xialv33").group()) ## 666 print(re.split(" ","hello abc def")) # 按空格分開 print(re.split("[ |]","hello abc|def")) # 按空格或豎線分開 print(re.split("[ab]","aassfabcde")) # 按a或b分開 print(re.split("ab","aassfabcde")) # 按 ab 分開 print(re.sub("\d+","*","asdf23asdfs88223asdfg")) # 數字被替換成* print(re.sub("\d","*","asdf23asdfs88223asdfg",5)) # 單個數字被替換成* 只替換5次 print(re.subn("\d+","*","asdf23asdfs88223asdfg")) # 返回元組(結果,次數) com = re.compile("\d+") # 賦值到變數,方便使用。 print(com.findall("asdf4123ghjkoo899dddsa")) ret = re.finditer("\d","fasdf765rqwrq3wcascsc32dfasdf") ##返回一個迭代器物件 print(next(ret).group()) # 拿到迭代器中第一個 print(next(ret)) print(re.findall("www\.(baidu|163)\.com","http://www.baidu.com/index.html")) # 只能拿到 baidu 因為預設有分組,優先返回分組 print(re.findall("www\.(baidu|163)\.com","http://www.163.com/index.html")) # 只能拿到 163 因為預設有分組,優先返回分組 print(re.findall("www\.(?:baidu|163)\.com","http://www.baidu.com/index.html")) # www.baidu.com 因為加了去優先順序 ?:
正則表示式補充: findall 和 split 遇到了括號(分組)時,有特殊處理。
# ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') # print(ret) # ['oldboy'] # 這是因為findall會優先把匹配結果組裡內容返回,如果想要匹配結果,取消許可權即可 # 取消分組優先, ?: ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') print(ret) # ['www.oldboy.com'] # ret = re.split("(\d+)", "eva3egon4yuan") # print(ret) # 結果 : ['eva', '3', 'egon', '4', 'yuan'] ret = re.split("\d+", "eva3egon4yuan") print(ret) # 結果 : ['eva', 'egon', 'yuan']
import re # 身份證號碼 ret = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$', '110105199912122277') print(ret.group()) print(ret.group(1)) # 拿到第一個括號內 print(ret.group(2)) # 拿到第二個括號內 # 手機號碼 phone_number = input('please input your phone number : ') if re.match('^(13|14|15|17|18)[0-9]{9}$',phone_number): print('合法的手機號碼') else: print('不是合法的手機號碼')