zoukankan      html  css  js  c++  java
  • 20.logging日志 re正则

     logging

    日志:日常的流水 => 日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中

    为什么要记录日志:优化程序,更好的服务

    五个级别

    logging.debug('调试 msg')
    logging .info('消息 msg')
    logging .warning('警告 msg')

    logging.error('错误 msg')
    logging.critical('严重 msg')

    标准三流

    import sys

    # 标准输出流
    sys.stdout.write('123 ')
    sys.stdout.write('456 ')
    print('值形成VB',end='')
    print()

    # 标准错误流
    sys.stderr .write('11111')
    sys.stderr .write('22222')
    sys.stderr .write('444444444')

    # 标准输入流

    res=sys.stdin.readline()
    print(res)

    logging的基本配置

    import logging

    import sys

    logging.basicConfig(
        stream=sys.stdout
    )

    可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
    filename:用指定的文件名创建FiledHandler,日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。
    level:设置rootlogger的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到

    sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。


    format参数中可能用到的格式化串:
    %(name)s:Logger的名字,并非用户名

    %(levelno)s:数字形式的日志级别

    %(levelname)s:文本形式的日志级别

    %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有

    %(filename)s:调用日志输出函数的模块的文件名

    %(module)s:调用日志输出函数的模块名

    %(funcName)s:调用日志输出函数的函数名

    %(lineno)d:调用日志输出函数的语句所在的代码行

    %(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示

    %(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数

    %(asctime)s:字符串形式的当前时间。默认格式是 “2019-05-09 16:49:45,896”。逗号后面的是毫秒

    %(thread)d:线程ID。可能没有

    %(threadName)s:线程名。可能没有

    %(process)d:进程ID。可能没有

    %(message)s:用户输出的消息

    h1=logging.StreamHandler()
    h2=logging.StreamHandler('d.loy')
    logging.basicConfig(
        format='%(asctime)S [%(levelname)S]-%(name)S',
        datename='%Y-%m-%D %H:%M:%S',
        leval=logging.DEBUG,
        handlers=[h1,h2]
    )

     

    logging成员

    import logging

    logger:产生日志的对象

    Filter:过滤日志的对象

    Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

    formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式


    1.新建打印者


    logger=logging.getLogger('风月')
    2.创建句柄,即输出的位置
    stream_handler=logging.StreamHandler ()
    a_file_handlear=logging.FileHandler('aa.log')
    b_file_handlear=logging.FileHandler('bb.log')
    3.打印者绑定句柄
    logger.addHandler(stream_handler )
    logger.addHandler(a_file_handlear)
    logger.addHandler(b_file_handlear)


    设置格式
    Formatter1=logging.Formatter('%(asctime)s-%(msg)s')
    Formatter2=logging.Formatter ('%(asctime)s [%(name)s]-%(msg)s')

    5.为句柄绑定输出格式


    stream_handler.setFormatter(Formatter1)
    stream_handler.setFormatter(Formatter1)
    stream_handler.setFormatter(Formatter2)

    logger.critical('msg')

     

    logger共存

     

    import logging


    1.新建打印者
    logger=logging.getLogger('风月')
    2.创建句柄,即输出的位置
    stream_handler=logging.StreamHandler ()
    a_file_handlear=logging.FileHandler('aa.log')
    b_file_handlear=logging.FileHandler('bb.log')
    3.打印者绑定句柄
    logger.addHandler(stream_handler )
    logger.addHandler(a_file_handlear)
    logger.addHandler(b_file_handlear)

    4.设置格式


    Formatter1=logging.Formatter('%(asctime)s-%(msg)s')
    Formatter2=logging.Formatter ('%(asctime)s [%(name)s]-%(msg)s')
    5.为句柄绑定输出格式
    stream_handler.setFormatter(Formatter1)
    stream_handler.setFormatter(Formatter1)
    stream_handler.setFormatter(Formatter2)

    logger.critical('风月')

     

    正则re

    模块re

    import re
    # re就正则,是有语法的字符串,用来匹配目标字符串的

    data = 'https://www.baidu.com'
    # 需求:判断该数据是否是合法的url链接
    # 合法的url应该满足:以 https:// | http:// 开头 且以 com | cn 结尾
    # 字符串匹配,根据你的规定书写字符串与目标字符串进行配对,如果能配对成功,代表目标字符串满足需求
    # 正则表达式:是一个可以同时制定多个规则的字符串


    res = re.findall('https://www.baidu.com', data)
    print(res)


    # 将目标字符串中的所有数字找出
    date='123qwe嗯嗯'
    res=re.findall(r'd',date)
    print(res)

    # 字母
    res=re.findall('[a-z]',date)
    print(res)

     

     

    语法re

    import re

    # r 原义字符串

    res='abc123嗯嗯abcABC'

    # re.I不区分大小写的匹配
    print(re.findall(r'a',res,flags=re.I) )
    # a|b a或b单个字符
    print(re.findall(r'a|b',res,flags=re.I) )
    # [a,b] a或,或b单个字符
    print(re.findall(r'[a,b]',res,flags=re.I) )
    # [^ab]非a及非b的所有单个字符
    print(re.findall(r'[^ab]',res,flags=re.I) )
    # [a-z]所有单个小写字母
    # A-Z]所有单个大写字母
    # [0-9]所有单个数字
    print(re.findall(r'[a-z]', res))
    print(re.findall(r'[0-9]',res))
    # 所有小写大写数字单个字符
    print(re.findall(r'[0-9]|[a-z]|[A-Z]',res))
    #   d  单个数字 == [0-9]
    print(re.findall(r'd', res))
    # w == [A-Za-z0-9_]  将常见的汉字就理解为单个字母
    print(re.findall(r'w', 'abc,123嘿[_'))
    # s 单个空:空格、制表符、换页符等
    print('f v')
    print(re.findall(r's', 'f v '))
    # D就是d的对立面:非数字的所有单个字符
    #  W就是w的对立面
    #  S就是s的对立面
    print(re.findall(r'D', 'abc,123嘿[_'))
    print(re.findall(r'S', 'abc,123嘿[_'))
    print(re.findall(r'W', 'abc,123嘿[_'))

     

    import re

    # 匹配这个字符
    print(re.findall(r'\', 'adp\'))
    print(re.findall(r'\', r'adp\'))

    print(re.findall(r' ', ' '))
    # 转换成匹配换行符的正则对象
    print(re.findall(r'd', 'd'))
    print(re.findall(r'\d', 'd'))

    re_obj=re.compile(r'\d')
    # 转换成匹配 d 的正则对象
    res=re_obj.findall('d')
    print(res)

    re_obj=re.compile(r'd')
    # 转换成匹配 数字 的正则对象
    res=re_obj.findall('d')
    print(res)


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

     

    多个字符

    import re

    # .会匹配除 以为的所有单个字符
    print(re.findall(r'.','*\_+= ') )
    # re.S会让.能匹配所有单个字符
    print(re.findall(r'.','*\_+= ',re.S))

    # 明确个数的重复
    # {n}
    print(re.findall(r'a', 'aaabbb'))
    print(re.findall(r'a{2}', 'aaabbb'))
    print(re.findall(r'b', 'aaabbb'))
    print(re.findall(r'b{2}', 'aaabbb'))
    print(re.findall(r'ab{2}', 'aaabbb'))

    # {n,} 贪婪匹配
    #  匹配n到无数个,
    # 题中最少匹配abb,
    # 贪婪匹配 abbb 能被匹配为 abb 和 abbb,
    # 优先匹配多的

    print(re.findall(r'ab{2,}', 'ababbabbbabbbb'))
    # {,n}
    # 匹配0到n个,
    # ab{,2} 优先匹配abb,
    # 没有ab也行,如果还没有a也可以
    print(re.findall(r'ab{,2}', 'ababbabbbabbbb'))

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

    # 特殊符号的重复
    # *: 匹配0到无数个
    print(re.findall(r'ab*', 'aababbabbbabbbb'))

    # +: 匹配1到无数个
    print(re.findall(r'ab+', 'aababbabbbabbbb'))

    # ?: 匹配0到1个
    print(re.findall(r'ab?', 'aababbabbbabbbb'))


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


    # 代表单词边界,用空格(字符串的结尾也包括)作为匹配规则

    print(re.findall(r'[a-z]*c', 'abc def hello print acb zc'))
    print(re.findall(r'[a-z]*c', 'abc def hello print acb zc'))

    分组匹配

    import re

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

    # ()代表分组
    # findall匹配,如果匹配规则用有分组语法,只存放分组结果
    print(re.findall(r'(www).([a-z]+).com', url))
    # 分组的顺序编号按照左括号的前后顺序
    print(re.findall(r'(((w)ww).([a-z]+).com)', url))

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

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

    正则方法

    import re

    s = 'a b ac def'
    print(s.split(' '))

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

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


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

     

  • 相关阅读:
    【C语言篇】☞ 2. 常量、变量、scanf函数和printf 函数
    【C语言篇】☞ 1. 前言、基础
    React快速入门教程
    数论-欧拉函数
    数论-约数
    数论-质数专题
    匈牙利算法求二分图的最大匹配数
    染色法判断二分图
    Kruskal算法
    Prim算法
  • 原文地址:https://www.cnblogs.com/komorebi/p/10841896.html
Copyright © 2011-2022 走看看