1. 程式人生 > >學習總結(二十)

學習總結(二十)

並且 asc 字符 error 文件的 log perl正則 cal 底層

1.標準三流

import sys
sys.stdin:input的底層
res = sys.stdin.readline()


sys.stdout:print的底層
sys.stdout.write(‘輸出的信息\n‘)


sys.stderr:異常及logging默認打印方式的底層
sys.stderr.write(‘輸出的信息\n‘)

2.logging模塊

操作日誌的模塊
日誌:日常的流水,將程序運行過程中的狀態或數據進行記錄,一般都是記錄到日誌文件中
在正常的項目中,項目運行的一些打印信息,采用looging打印到文件中,這個過程就稱之為 記錄日誌

import logging

# logging為默認打印者,名字叫root,配置采用以下方式
h1 = logging.StreamHandler()
h2 = logging.FileHandler(‘d.log‘)
logging.basicConfig(
    # filename=‘my.log‘,
    # filemode=‘w‘,
    # stream=sys.stderr,  # 往控制臺打印采用具體的輸出流
    format=‘%(asctime)s [%(levelname)s]- %(name)s: %(message)s‘,
    datefmt=‘%Y-%m-%d %H:%M:%S‘,
    level=logging.DEBUG,  # 10, 代表DEBUG及DEBUG級別以上都能輸出
    handlers=[h1, h2]
)

logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

  

3.loggin四大成員

 1.新建打印者
logger = logging.getLogger("Owen")

 2.創建句柄:輸出的位置
stream_handler = logging.StreamHandler()
a_file_handler = logging.FileHandler(‘a.log‘)
b_file_handler = logging.FileHandler(‘b.log‘)


3.打印者綁定句柄
logger.addHandler(stream_handler)
logger.addHandler(a_file_handler)
logger.addHandler(b_file_handler)

4.設置格式
fmt1 = logging.Formatter(‘%(asctime)s - %(msg)s‘)
fmt2 = logging.Formatter(‘%(asctime)s [%(name)s] - %(msg)s‘)

5.為句柄綁定輸出格式
stream_handler.setFormatter(fmt1)
a_file_handler.setFormatter(fmt1)
b_file_handler.setFormatter(fmt2)

ogger.critical(‘msg‘)

  

4.logging常用方法

import logging
# 1.創建logger
log1 = logging.getLogger(‘Owen‘)
log2 = logging.getLogger(‘Zero‘)
r_log = logging

# 2.logger設置級別
log1.setLevel(logging.DEBUG)

# 3.設置句柄
h1 = logging.StreamHandler()

# 4.設置句柄級別:
# 1)系統句柄默認級別warning,
# 2)自定義的句柄級別默認同logger,也可以在logger基礎上在加以限制
h1.setLevel(logging.DEBUG)

# 5.logger添加句柄
log1.addHandler(h1)

# log1可以打印DEBUG以上的信息,但往不同位置打印,采用不同句柄的二次級別限制
h2 = logging.FileHandler(‘c.log‘)
h2.setLevel(logging.WARNING)
log1.addHandler(h2)


log1.debug(‘debug‘)
log1.info(‘info‘)
log1.warning(‘warning‘)
log1.error(‘error‘)
log1.critical(‘critical‘)

log2.critical(‘00000‘)

r_log.critical(‘00000‘)

5.配置文件的使用

# 1.配置
LOGGING_DIC = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘formatters‘: {
        ‘o_fmt1‘: {
            ‘format‘: ‘%(name)s:%(asctime)s - %(message)s‘
        },
        ‘o_fmt2‘: {
            ‘format‘: ‘%(name)s:%(asctime)s [%(levelname)s] - %(message)s‘
        }
    },
    ‘filters‘: {},
    ‘handlers‘: {
        ‘o_cmd‘: {
            ‘level‘: ‘DEBUG‘,
            ‘class‘: ‘logging.StreamHandler‘,
            ‘formatter‘: ‘o_fmt1‘
        },
        ‘o_file‘: {
            ‘level‘: ‘WARNING‘,
            ‘class‘: ‘logging.handlers.RotatingFileHandler‘,
            ‘formatter‘: ‘o_fmt2‘,
            ‘filename‘: r‘F:\python8期\課堂內容\day20\代碼\part4\logging.log‘,  # 日誌文件
            ‘maxBytes‘: 1024*1024*5,  # 日誌大小 5M
            ‘backupCount‘: 5, #日誌文件最大個數
            ‘encoding‘: ‘utf-8‘,  # 日誌文件的編碼
        }
    },
    ‘loggers‘: {
        ‘o_owen‘: {
            ‘level‘: ‘DEBUG‘,
            ‘handlers‘: [‘o_cmd‘, ‘o_file‘]
        },
        ‘o_zero‘: {
            ‘level‘: ‘DEBUG‘,
            ‘handlers‘: [‘o_file‘]
        }
    }
}

# 2.加載配置
import logging.config
logging.config.dictConfig(LOGGING_DIC)


# 3.使用
log = logging.getLogger(‘o_owen‘)
log.warning(‘123‘)

  

6.正則表達式

1)什麽是正則表達式

一組特殊符號組成的表達式,用於描述某種規則。該應用場景生活中隨處可見。

例如:讓有誌青年過上體面的生活,這裏面就由規則,即有誌青年。

2)正則表達式的作用,以及使用場景

1.用於從字符串中匹配滿足某種規則的內容,多數用於爬蟲應用程序

2.判斷字符串串內容是否滿足某種規則,多用於嚴重用戶輸入。例如密碼是否規範,手機號是否正確等

學習重點

正則是一堆特殊符號組成的,我們主要學習的就是這些特殊符號

元字符描述
\ 將下一個字符標記符、或一個向後引用、或一個八進制轉義符。例如,“\n”匹配\n。“\n”匹配換行符。序列“\”匹配“\”而“(”則匹配“(”。即相當於多種編程語言中都有的“轉義字符”的概念。
^ 匹配輸入字行首。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之後的位置。
$ 匹配輸入行尾。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表達式任意次。例如,zo能匹配“z”,也能匹配“zo”以及“zoo”。等價於{0,}。
+ 匹配前面的子表達式一次或多次(大於等於1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。
{n} n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。
{n,} n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。
{n,m} mn均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o為一組,後三個o為一組。“o{0,1}”等價於“o?”。請註意在逗號和兩個數之間不能有空格。
? 匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。?等價於{0,1}。
? 當該字符緊跟在任何一個其他限制符(,+,?,{n},{n,},{n,m*})後面時,匹配模式是非貪婪的。非貪婪模式盡可能少地匹配所搜索的字符串,而默認的貪婪模式則盡可能多地匹配所搜索的字符串。例如,對於字符串“oooo”,“o+”將盡可能多地匹配“o”,得到結果[“oooo”],而“o+?”將盡可能少地匹配“o”,得到結果 [‘o‘, ‘o‘, ‘o‘, ‘o‘]
.點 匹配除“\n”和"\r"之外的任何單個字符。要匹配包括“\n”和"\r"在內的任何字符,請使用像“[\s\S]”的模式。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”(此處請謹慎)。“[zf]ood”則匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 負值字符集合。匹配未包含的任意字符。例如,“abc”可以匹配“plain”中的“plin”任一字符。
[a-z] 字符範圍。匹配指定範圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字符。註意:只有連字符在字符組內部時,並且出現在兩個字符之間時,才能表示字符的範圍; 如果出字符組的開頭,則只能表示連字符本身.
[^a-z] 負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,“a-z”可以匹配任何不在“a”到“z”範圍內的任意字符。
\b 匹配一個單詞的邊界,也就是指單詞和空格間的位置(即正則表達式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這裏的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1”可以匹配“1_23”中的“1”,但不能匹配“21_3”中的“1_”。
\B 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”
\s 匹配任何不可見字符,包括空格、制表符、換頁符等等。等價於[ \f\n\r\t\v]。
\S 匹配任何可見字符。等價於 \f\n\r\t\v
\w 匹配包括下劃線的任何單詞字符。類似但不等價於“[A-Za-z0-9_]”,這裏的"單詞"字符使用Unicode字符集。
\W 匹配任何非單詞字符。等價於“A-Za-z0-9_”。
\d 匹配一個數字字符。等價於[0-9]。grep 要加上-P,perl正則支持
\D 匹配一個非數字字符。等價於0-9。grep要加上-P,perl正則支持
\n 匹配一個換行符。等價於\x0a和\cJ。
\r 匹配一個回車符。等價於\x0d和\cM。
\t 匹配一個制表符。等價於\x09和\cI。
( ) 將( 和 ) 之間的表達式定義為“組”(group),並且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用 \1 到\9 的符號來引用。
(?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以後使用。這在使用或字符“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。
| 將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。註意:這個元字符不是所有的軟件都支持的。

首先介紹的是re模塊的findall方法,該方法用於從字符串中獲取所有匹配成功的內容:

import re
res = re.findall("表達式","字符串內容")

# 該方法得到一個列表
print(res)



search

僅獲取第一個匹配的內容

match

從字符串開始處開始匹配

compile

得到一個的表達式對象,後期可以重復使用

split

使用正則表達式來切分字符串

 

學習總結(二十)