zoukankan      html  css  js  c++  java
  • re、logging日志模块

    1、re:

    正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

    2、findall 全部找到返回一个列表:

    s = "alex,meet,eva_j"
    import re
    print(re.findall('e',s)) # 参数1:要查找的内容,参数2:从哪查找,3、返回结果是列表的形式
    结果:['e', 'e', 'e', 'e']
    3、w 匹配中文,字母,数字,下划线:
    import re
    s = "alex1!,你哈t2,eva_j@!"
    print(re.findall("w",s)) # 匹配字母(包含中文)或数字或下划线 ***
    结果:['a', 'l', 'e', 'x', '1', '你', '哈', 't', '2', 'e', 'v', 'a', '_', 'j']
    4、W 不匹配中文,字母,数字,下划线:
    import re
    s = "alex1!,你哈t2,eva_j@!"
    print(re.findall("W",s)) # 匹配非字母(包含中文)或数字或下划线 ***
    结果:['!', ',', ',', '@', '!']
    5、s 匹配任意的空白符:
    import re
    s = " zhangda@, "
    print(re.findall("s",s)) # 匹配任意空白符
    结果:[' ', ' ']
    6、S 匹配不是任意的空白符:
    import re
    s = " zhangda@, "
    print(re.findall("S",s)) # 匹配任意非空白符包含特殊符号 ***
    结果:['z', 'h', 'a', 'n', 'g', 'd', 'a', '@', ',']
    7、d 匹配数字:
    import re
    s = " 123zhangda@, "
    print(re.findall('d',s)) # 匹配数字 ***
    结果:['1', '2', '3']
    8、D 匹配非数字:
    import re
    s = " 123zhangda@, "
    print(re.findall('D',s))
    结果:[' ', 'z', 'h', 'a', 'n', 'g', 'd', 'a', '@', ',', ' ']
    9、从字符串开头匹配:
    import re
    s = "Adsasf"
    print(re.findall("AA",s)) #A从字符串开头匹配、从字符串开头匹配没有就返回空列表
    结果:['A']
    10、^匹配字符串的开始:
    import re
    s = "Adsasf"
    print(re.findall("^A",s)) # 匹配开头没有就返回空列表 ***
    结果:['A']
    11、匹配字符串的结束,如果是换行,只匹配到换行前的结果:
    import re
    s = "Adsasf"
    print(re.findall("f",s))
    结果:['f']
    12、$匹配字符串的结尾:
    import re
    s = "Adsasf"
    print(re.findall("f$",s)) # 匹配结尾 ***
    结果:['f']
    13、.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
    import re
    s = "!@#$5%0,1,2AAAA,113,-4,5,-6,7,9alex_meet "
    print(re.findall(".",s)) # 匹配任意字符串(换行和制表符除外) ***
    结果:['!', '@', '#', '$', '5', '%', '0', ',', '1', ',', '2', 'A', 'A', 'A', 'A', ',', '1', '1', '3', ',', '-', '4', ',', '5', ',', '-', '6', ',', '7', ',', '9', 'a', 'l', 'e', 'x', '_', 'm', 'e', 'e', 't']
    print(re.findall(".",s,re.DOTALL))
    结果:['!', '@', '#', '$', '5', '%', '0', ',', '1', ',', '2', 'A', 'A', 'A', 'A', ',', '1', '1', '3', ',', '-', '4', ',', '5', ',', '-', '6', ',', '7', ',', '9', 'a', 'l', 'e', 'x', '_', 'm', 'e', 'e', 't', ' ']
    14、[...]匹配字符组中的字符:
    import re
    s = "!@#$5%0,1,2AAAA,113,-4,5,-6,7,9alex_meet "
    print(re.findall("[0-9a-zA-Z]",s)) # [数字0-数字9和字母a-z和A-Z]
    结果:['5', '0', '1', '2', 'A', 'A', 'A', 'A', '1', '1', '3', '4', '5', '6', '7', '9', 'a', 'l', 'e', 'x', 'm', 'e', 'e', 't']
    import re
    s = "!@#$5%0,1,2AAAA,113,-4,5,-6,7,9alex_meet "
    print(re.findall("[0-9]",s)) # [数字0-数字9]
    结果:['5', '0', '1', '2', '1', '1', '3', '4', '5', '6', '7', '9']
    15、*匹配0个或者多个左边的字符 贪婪匹配方式:
    import re
    s = "aleex1.!,你哈t2,eev11a_j@!1111"
    print(re.findall("a*",s))
    结果:['a', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', '']
    16、+匹配一个或者多个左边的字符贪婪匹配方式
    import re
    s = "aleex1.!,你哈t2,eev11a_j@!1111"
    print(re.findall("a+",s))
    结果:['a', 'a']
    17、?匹配0个或者1个左边的字符,非贪婪方式:
    import re
    s = "aleex1.!,你哈t2,eev11a_j@!1111"
    print(re.findall("a?",s))
    结果:['a', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', '']
    18、{n}精准匹配n个前面的表达式:
    import re
    s1 = "aleex1.!,你哈t2,eev11a_j@!1111"
    print(re.findall("e{2}",s1)) # 精确
    print(re.findall("ee",s1))
    结果:['ee', 'ee']
    19、{n,m}匹配n到m次由前面的正则表达式定义的片段,贪婪方式:
    import re
    s1 = "aleex1.!,你哈t2,eev11a_j@!1111"
    print(re.findall('e{0,3}',s1)) # 范围
    结果:['', '', 'ee', '', '', '', '', '', '', '', '', '', '', 'ee', '', '', '', '', '', '', '', '', '', '', '', '', '']
    20、a|b 匹配a或者b:
    import re
    s1 = "alea121meeeeeeeet11123,wusir324"
    print(re.findall("a|e",s1)) # 或
    结果:['a', 'e', 'a', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e']
    21、() 匹配括号内的表达式,也表示一个组:
    import re
    s1 = "alea121meeeeeeeet11123,wusir324"
    print(re.findall("e(e)e",s1)) # 分组
    print(re.findall("m(eee)e",s1)) # 分组
    print(re.findall("e(?:e)e",s1)) # 分组
    结果: ['e', 'e']

        ['eee']
        ['eee', 'eee']

    22、找到所有带_sb的内容:

    s = 'alex_sb wusir_sb 的 alex wusir '
    import re
    print(re.findall("(.*)_sb",s))
    print(re.findall("(.+?)_sb",s)) # .... * 0 or .... 1
    print(re.findall("(.............)_sb",s))
    结果: ['alex_sb wusir']

        ['alex', ' wusir']
        ['alex_sb wusir']

    23、d匹配数字:

    import re
    s1 = "1-2*(60+(-40.35/5)-(-4*3))"
    print(re.findall("d+",s1))
    结果:['1', '2', '60', '40', '35', '5', '4', '3']
    24、. == 转义成普通的小数点:
    import re
    s1 = "1-2*(60+(-40.35/5)-(-4*3))"
    print(re.findall("d+.d+|d+",s1))
    结果:['1', '2', '60', '40.35', '5', '4', '3']
    25、匹配所有的数字(包含小数包含负号):
    print(re.findall("-d+.d+|-d+|d+",s1))
    结果:['1', '-2', '60', '-40.35', '5', '-4', '3']
    26、匹配所有邮箱:
    import re
    s2 = "http://blog.csdn.net/make164492212@163.com/article/details/51656638" # 匹配所有邮箱
    print(re.findall('w+@d+.com',s2))
    结果:['make164492212@163.com']
    27、匹配qq号:腾讯从10000开始:
    import re
    s6 = "1231231,324233,123,1123,2435,1234,2546,23451324,3546354,13241234"
    print(re.findall('d{5,11}',s6))
    结果:['1231231', '324233', '23451324', '3546354', '13241234']
    28、search、match:
    search  *****  # 从字符串任意位置进行匹配,查找到一个就停止了
    match ***** # 从字符串开始位置进行匹配,找不返回None
    29、split分割:
    import re
    print(re.split('[ ::,;;,]','alex wusir,日天,太白;女神;肖锋:吴超'))
    结果:['alex', 'wusir', '日天', '太白', '女神', '肖锋', '吴超']
    30、sub替换:
    import re
    s = 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。'
    print(re.sub('barry', 'meet',s))
    结果:meet是最好的讲师,meet就是一个普通老师,请不要将meet当男神对待。
    31、compile 定义匹配规则:
    import re
    obj = re.compile('d{2}')
    print(obj.findall("alex12345"))
    结果:['12', '34']
    32、给分组起名字:
    import re
    s = "<h1>hello</h1>"
    print(re.findall("<(w+)>",s))
    结果:h1
    33、logging模块:
    logging -- 日志
    1.记录程序运行状态
    # 时间,那个文件,报错行数,错误信息
    2.用户的喜好
    # 分析用户的一些喜好,操作
    3.银行
    # 账户的一些流水

    我们来说一下这个logging模块,这个模块的功能是记录我们软件的各种状态,你们现在和我一起找到红蜘蛛的那个图标,然后右键找一找是不是有个错误日志.其实每个软件都是有错误日志的,开发人员可以通过错误日志中的内容对他的程序进行修改

    这只是一种应用场景,有的还会将日志用于交易记录.比如你给我转账应该做记录吧,

    我们使用的信用卡,每消费的一笔都会记录,我们来看看这个日志怎么用?

    我们先来看一下函数式简单配置

    import logging  
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message')
    

    默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING

    (日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),

    默认的日志格式为日志级别:Logger名称:用户输出消息。

    我们自己用函数写的这个可以正常使用但是不够灵活,我们看看这个灵活的

    灵活配置日志级别,日志格式,输出位置:

    import logging  
    logging.basicConfig(level=logging.DEBUG,  
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                        datefmt='%a, %d %b %Y %H:%M:%S',  
                        filename='/tmp/test.log',  
                        filemode='w')  
    
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message')
    logging.debug("这是调试")
    logging.info("这是信息")
    logging.warning("这是警告")
    logging.error("这是错误")
    logging.critical("这是危险")

    basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

    • filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    • filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    • format:指定handler使用的日志显示格式。
    • datefmt:指定日期时间格式。
    • level:设置记录日志的级别
    • stream:用指定的stream创建StreamHandler。可以指定输出到
    • sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为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 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    • %(thread)d 线程ID。可能没有
    • %(threadName)s 线程名。可能没有
    • %(process)d 进程ID。可能没有
    • %(message)s用户输出的消息

    logger对象配置

    import logging
    
    logger = logging.getLogger()
    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler('test.log',encoding='utf-8') 
    
    # 再创建一个handler,用于输出到控制台 
    ch = logging.StreamHandler() 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    fh.setLevel(logging.DEBUG)
    
    fh.setFormatter(formatter) 
    ch.setFormatter(formatter) 
    logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 
    logger.addHandler(ch) 
    
    logger.debug('logger debug message') 
    logger.info('logger info message') 
    logger.warning('logger warning message') 
    logger.error('logger error message') 
    logger.critical('logger critical message')
    

    logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过

    fh.setLevel(logging.Debug)单对文件流设置某个级别。

    import logging
    looger = logging.getLogger() # 创建一个空架子
    fh = logging.FileHandler('test1.log',mode="a",encoding="utf-8")
    # 创建一个文件句柄,用来记录日志(文件流)
    ch = logging.StreamHandler()
    # 创建一个屏幕流,打印记录的内容
    f_str = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(filename)s %(lineno)s %(message)s")
    # 定义一个记录日志的格式
    looger.level = 10
    # 设置一个记录级别
    fh.setFormatter(f_str) # 给文件句柄设置记录内容的格式
    ch.setFormatter(f_str) # 给中控台设置打印内容的格式
    looger.addHandler(fh) # 将文件句柄添加的looger对象中
    looger.addHandler(ch) # 将中控台添加的looger对象中
    looger.debug(1234) # 咱们二次开发实现的
    looger.info(1234) # 咱们二次开发实现的
    looger.warning(1234) # 咱们二次开发实现的
    looger.error(1234) # 咱们二次开发实现的
    looger.critical(1234) # 咱们二次开发实现的
    """
    # logging.debug() # 人家自带的
  • 相关阅读:
    读取列表下标
    字典dict详解
    使用mysql的长连接
    oauth授权协议的原理
    安装性能测试工具:sysbench和使用apache的ab
    发送邮件出现问题
    获取用户的真实ip
    清理代码的阅读笔记
    开发中三个经典的原则
    要干大事就不能把面子看得太重
  • 原文地址:https://www.cnblogs.com/zhang-da/p/11704817.html
Copyright © 2011-2022 走看看