1. 程式人生 > >python模組之_正則 re_configparser_logging_hashlib

python模組之_正則 re_configparser_logging_hashlib

正則表示式的內容放在最下面了 

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('不是合法的手機號碼')
複製程式碼