加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

常用的模块 日志 与 正则

发布时间:2020-12-14 06:01:44 所属栏目:百科 来源:网络整理
导读:标准三流? ???1.输入流? ? ? ? ?2.输出流? ? ? ?3. 错误流 impor sys sys.stdin:? ? ?input的底层? ? ? ? ? ?? - sys.stdin.redline() sys.stdout:? ? ?print de 底层? ? ? ? ? ? - sys.stdout.write() sys.stderr:? ? ? ?日常及logging默认打印方式的底层?

标准三流? ???1.输入流? ? ? ? ?2.输出流? ? ? ?3. 错误流

impor sys

sys.stdin:? ? ?input的底层? ? ? ? ? ??

-  sys.stdin.redline()

sys.stdout:? ? ?print de 底层? ? ? ? ? ?

-  sys.stdout.write()

sys.stderr:? ? ? ?日常及logging默认打印方式的底层? ? ? ? ? ??

-  sys.stderr.write()

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")

loggin四大成员? ? ?Handler? ? ? ? ? ? ?Logger? ? ? ? ??Filter? ? ? ? ? ? ? ?Formatter

import logging
# logging为默认打印者,名字叫root,配置采用以下方式
h1 = logging.StreamHandler()
h2 = logging.FileHandler(d.log)
logging.basicConfig(
    # filename=my.log,h2]
)

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



多输出者

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‘)

?

配置文件的使用

# 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代码part4logging.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‘,‘o_file‘]
? ? ? }
? }
}
?
# 2.加载配置
import logging.config
logging.config.dictConfig(LOGGING_DIC)
?
?
# 3.使用
log = logging.getLogger(‘o_owen‘)
log.warning(‘123‘)

?

?

?

?

?







?

?

re模块

正则:有语法的字符串,用来匹配目标字符串,

# 将目标字符串中的所以数字找出
data = 123abc呵呵

res = re.findall(rd,data)  # d就代表数字
print(res)  # [1,2,3]

正则匹配步骤

import re
# 1.将r的正则语法字符串转换成 正则对象 ‘,用来匹配  字符的
# 2.拿着转换后的正则对象,来匹配目标字符串
print(re.findall(r,radp))  # [,,]


re_obj = re.compile(rn)  # 转换成匹配 换行符 的正则对象
res = re_obj.findall(n)
print(res)  # [n]

re_obj = re.compile(rd)  # 转换成匹配 d 的正则对象
res = re_obj.findall(d)
print(res)  # [d]

re_obj = re.compile(rd)  # 转换成匹配 数字 的正则对象
res = re_obj.findall(d)  # d不是数字
print(res)  # []

re_obj = re.compile(rn)  # 转换成匹配 n 的正则对象
res = re_obj.findall(n)  # 代表换行,不能被匹配
print(res)  # []
res = re_obj.findall(rn)  # 就代表n,能被匹配
print(res)  # [n]

单个字符

?

# re.I不区分大小写的匹配
print(re.findall(ra,abc123嘿嘿abcABC,flags=re.I))  # [a,a,A]

# a|b a或b单个字符
print(re.findall(ra|b,b,A,B]

# [a,b] a或,或b单个字符
print(re.findall(r[a,b],abc,123嘿嘿abcABC,,,B]

# [^ab]非a及非b的所有单个字符
print(re.findall(r[^ab],123嘿嘿abcABC))  # [c,1,3,,c,B,C]

# [a-z]所有单个小写字母   [A-Z]所有单个大写字母   [0-9]所有单个数字
print(re.findall(r[a-z],123嘿嘿abcABC))  # [a,c]
print(re.findall(r[0-9],123嘿嘿abcABC))  # [1,3]

# 所有小写大写数字单个字符
print(re.findall(r[a-z]|[A-Z]|[0-9],C]

print(re.findall(r[A-Za-z0-9],123嘿嘿[abcABC))  # [a,C]

# .会匹配除n以为的所有单个字符
print(re.findall(r.,*_+=n rt))  # [*,_,+,=, ,r,t]

# re.S会让.能匹配所有单个字符
print(re.findall(r.,*_+=n rt,flags=re.S))  # [*,n,t]

# d单个数字 == [0-9]
print(re.findall(rd,123嘿嘿[abcABC))  # [1,3]
# w == [A-Za-z0-9_]  将常见的汉字就理解为单个字母

print(re.findall(rw,123嘿[_))  # [a,_]
# s == [fnrtv ] 单个空:空格、制表符、换页符等

print(re.findall(rs,fnrtv ))  # [x0c,t,x0b, ]

# D就是d的对立面:非数字的所有单个字符  W就是w的对立面  S就是s的对立面
print(re.findall(rD,[,_]


# 单个汉字 [u4e00-u9fa5]
print(re.findall(r[u4e00-u9fa5],123嘿[_))  # []

# 建议使用  [0-9]  [A-Za-z0-9_]  [fnrtv ]  [^0-9]  [u4e00-u9fa5]
# 不建议使用 d            w            s             D            w

多个字符

# 明确个数的重复
# {n}
print(re.findall(ra,aaabbb))  # [a,a]
print(re.findall(ra{2},aaabbb))  # [aa]
print(re.findall(rab,aabbababab))  # [ab,ab,ab]
print(re.findall(ra{2}b{2},aabbababab))  # [aabb]
print(re.findall(rab{2},aabbababab))  # [abb]

# {n,}  匹配n到无数个,题中最少匹配abb,贪婪匹配 abbb 能被匹配为 abb 和 abbb,优先匹配多的
print(re.findall(rab{2,},ababbabbbabbbb))  # [abb,abbb,abbbb]

# {,n} 匹配0到n个,ab{,2} 优先匹配abb,没有ab也行,如果还没有a也将就
print(re.findall(rab{,2},aababbabbbabbbb))  # [a,abb,abb]

# {n,m} 匹配n到m个,ab{1,3} 优先匹配 abbb,再考虑abb,ab
print(re.findall(rab{1,3},aababbabbbabbbb))  # [ab,abbb]

# 特殊符号的重复
# *: 匹配0到无数个
print(re.findall(rab*,abbbb]
# +: 匹配1到无数个
print(re.findall(rab+,abbbb]
# ?: 匹配0到1个
print(re.findall(rab?,ab]


# 需求:匹配所以单词
print(re.findall(r[a-z]+,abc def hello print))  # [abc,def,hello,print]
print(re.findall(r[a-z]+b,print]

# b代表单词边界,用空格(字符串的结尾也包括)作为匹配规则
print(re.findall(r[a-z]*c,abc def hello print acb zc))  # [abc,ac,zc]
print(re.findall(r[a-z]*cb,zc]

多行匹配

import re
s = """http://www.baidu.com
https://sina.com.cn
https://youku.com
haam
abchttp://www.oldboy.com
"""
# ^代表以什么开头,$代表以什么结尾,必须结合flags=re.M来完成多行匹配
print(re.findall(r^http.+com$,s,re.M))  # [http://www.baidu.com,https://youku.com]

分组

import re

url = https://www.baidu.com,http://www.youku.com
# 需求:拿到url的域名的  baidu,youku
print(re.findall(rwww.([a-z]+).com,url))  # [baidu,youku]

# ()代表分组
# findall匹配,如果匹配规则用有分组语法,只存放分组结果
print(re.findall(r(www).([a-z]+).com,url))  # [(www,baidu),(www,youku)]

# 分组的编号:分组的顺序编号按照左括号的前后顺序
print(re.findall(r(((w)ww).([a-z]+).com),url))  # [(www.baidu.com,www,w,(www.youku.com,youku)]


# findall是全文匹配,可以从任意位置开始,匹配多次
# match非全文匹配,必须从头开始匹配,只能匹配一次

# 专门处理分组的方法:分组,分组编号,有名分组,取消分组
# 取消分组: 必须写(),但是()为分组语法,我们只是想通过()将一些数据作为整体,所以()必须,再取消分组即可
# (?:) 取消分组只是作为整体   (?P<名字>) 有名分组
url = www.baidu.com,www.youku.com
res = re.match(r((?:www).(?P<name>[a-z]+).com),url)
# print(res)  # <_sre.SRE_Match object; span=(0,13),match=www.baidu.com>
print(res.group(1))  # www.baidu.com
print(res.group(2))  # baidu
print(res.group(name))  # baidu

拆分与替换

import re

s = a b ac def
print(s.split( ))  # [a,def]

# 正则拆分
s = a b,[email?protected]
print(re.split(r[,@],s))  # [a,def]


s = python abc python
print(re.sub(python,Python,s))  # Python abc Python
print(re.sub(python,Python,count=1))  # Python abc python


# 结合分组可以完成信息的重组与替换
s = day a good!!!  # a good good day
print(re.sub((day) (a) (good),rtoday is 2 3 3 1,s))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读