zoukankan      html  css  js  c++  java
  • login 模块,re 模块

    标准三流

    标准输入流:sys. stdin  # input的底层

    标准输出流:sys. stdout     # print的底层

    标准错误流:sys. stderr      # 异常及logging默认打印方式的底层

    loggin模块
    日志:记录日常的流水 => 将程序运行过程中的状态或数据进行记录,记录到日志文件中
    import logging
    logging配置:格式化输出 1)输出的方式 2)输出的格式 3)输出的位置
    #基础配置如下:
    logging.basicConfig(
    filename='my_log.log',
    filemode='w', #默认a追加
    #stream = sys.stderr,  往控制台打印采用具体的输出流 ,只能往一个地方,要么文件,要么控台
    format='%(asctime)s- %(name)s -%(levelname)s - %(module)s-%(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',
    level=logging.INFO,) #  10,代表DEBUG及DEBUG级别以上都能输出

    五个日志级别,级别本身没有代表信息重要性的级别,人为约定信息的级别。
    可以设置级别,打印满足对应级别的信息
    logging.info('info') #10
    logging.debug('debug') #20
    logging.warning('warning') #30
    logging.error('error') #40
    logging.critical('critical') #50

    #不能将日志信息按不同的配置【日志格式,日志种类、等】写到不同的文件


    四大成员:
    1. logger     对象
    2. filter        一种过滤规则
    3. handler   控制输出的位置句柄,如往文件1、文件2..控制台
    4.formater  输出的格式
    '''
     1.logger对象
    logger1 = logging.getLogger('O_WEN') #不写默认是root

    2.filter对象:过滤日志


    3.handler对象
    fh1 = logging.FileHandler('a1.log', encoding='utf-8',) # 默认mode='a',
    fh2 = logging.FileHandler('a2.log',encoding='utf-8')
    ch = logging.StreamHandler()  #打印到控制台


    4.formater 控制输出格式
    formater1 = logging.Formatter(
    fmt='%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',)

    formater2 = logging.Formatter(
    fmt='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H: %S %p',
    )

    # 5.绑定logger对象与handler对象
    logger1.addHandler(fh1)
    logger1.addHandler(fh2)
    logger1.addHandler(ch)

    # 6.绑定hgandler与formater
    fh1.setFormatter(formater1)
    fh2.setFormatter(formater1)
    ch.setFormatter(formater2)

    # 7.设置logger级别,有logger对象与handle对象两层关卡,必须都放行,最终才会放行执行
    # 通常二者的级别相同
    logger1.setLevel(10)
    fh1.setLevel(10)
    fh1.setLevel(10)
    ch.setLevel(10)

    #8使用logger对象产生日志
    logger1.info('egon给owen转帐1000个亿美元')

    '''

    re模块

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

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

    data = 'https://www.baidu.com'
    res = re.findall('https://www.baidu.com',data) # ('第一个参数是你所指定的字符串','第二个是目标字符串')
    print(res)

    单个字符匹配

     将目标字符串中的所有数字找出  D 是d的对立面,除了d能找出的它都可以找出
    data = '123zbc啦啦啦'
    res = re.findall(r'd',data) # d 代表数字
    print(res)


    # 将目标字符串中的字母找出
    res = re.findall('[a-z]',data) # [a-z] 表示,在a~z 中的所有字母,基于ascii码
    print(res)


    # re.I 是不区分大小写的匹配
    print(re.findall(r'a','abcABC123abcABC',flags=re.I)) # 输出结果为['a', 'A', 'a', 'A']

    # a|b | 符号表示或 此处表示a或b单个字符
    print(re.findall(r'a|b','abcABC123abcABC',flags=re.I)) # 输出结果为 ['a', 'b', 'A', 'B', 'a', 'b', 'A', 'B']

    # [abc] a或,或b 或c 单个字符,与|符号不同,[]内可以添加多个字符
    print(re.findall(r'[abc]','abcABC123abcABC',flags=re.I))# 输出结果为['a', 'b', 'c', 'A', 'B', 'C', 'a', 'b', 'c', 'A', 'B', 'C']

    # [^ab]非a 及非b 的所有单个字符 取反,除了指定的字符,其他的都输出,
    print(re.findall(r'[^ab]','abcABC123abcABC')) # 输出结果 ['c', 'A', 'B', 'C', '1', '2', '3', 'c', 'A', 'B', 'C']

    # [a-z],[A-Z],[0-9] 单个输出范围内的字符
    print(re.findall(r'[a-z]','abcABC123abcABC')) # 结果['a', 'b', 'c', 'a', 'b', 'c']
    print(re.findall(r'[A-Z]','abcABC123abcABC')) # 结果['A', 'B', 'C', 'A', 'B', 'C']
    print(re.findall(r'[0-9]','abcABC123abcABC')) # 结果['1', '2', '3']
    # 可以组合使用
    print(re.findall(r'[0-9]|[A-Z]|[a-z]','abcABC123abcABC')) # 结果['a', 'b', 'c', 'A', 'B', 'C', '1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C']
    # 但是如果只是需要输出单个的数字,建议使用 d
    print(re.findall(r'd','abcABC123abcABC')) # 结果['1', '2', '3']

    # w == [a-zA-Z0-9]和一个_ 符号 而汉字也会理解为一个单个字母 而 W 是w的对立面
    print(re.findall(r'w','abcABC123哈哈!@#$%^_')) # 结果['a', 'b', 'c', 'A', 'B', 'C', '1', '2', '3', '哈', '哈', '_']

    # s 单个空的:空格,制表符,换页符 而S 是s的对立面
    print(re.findall(r's','f v')) # 结果 ['x0c', ' ', ' ', ' ', 'x0b']

    # 单个汉字
    print(re.findall(r'[u4e00-u9fa5]','abc..123哈哈#¥#_')) # 结果['哈', '哈']

    匹配多个字符
    # . 会匹配除
    以外的所有单个字符
    # print(re.findall(r'.','@#$%^&* ')) # 没有输出['@', '#', '$', '%', '^', '&', '*', ' ', ' ']

    # 而 re.S 可以让 . 匹配所有单个字符
    # print(re.findall(r'.','@#$%^&* ',re.S)) # 可以输出了['@', '#', '$', '%', '^', '&', '*', ' ', ' ', ' ']



    # 明确个数的重复
    # {n}
    # print(re.findall(r'a','aaabbb')) # 输出结果['a', 'a', 'a']
    #
    # print(re.findall(r'a{2}','aaabbb')) # 结果['aa'] {}内是前面字符的个数
    #
    # print(re.findall(r'ab','aabbabab')) # 结果['ab', 'ab', 'ab']
    #
    # print(re.findall(r'a{2}b{2}','aabbaabbababab')) # 结果['aabb', 'aabb']
    #
    # print(re.findall(r'ab{2}','aabbababaabb')) # 结果['abb', 'abb'] {}内的个数,只对前一个字符有效

    # {n,} 匹配n到无数个,被称为贪婪匹配,在下面案例中,优先匹配个数多的,然后依次递减,直至最少需求
    # print(re.findall(r'ab{2,}','abbababbabaabbabbbbbb')) # 结果['abb', 'abb', 'abb', 'abbbbbb']

    # {,n} 匹配0-n个,ab{,2} 优先匹配abb,没有ab也可以,如果ab也没有,有a也会匹配到
    # print(re.findall(r'ab{,2}','aababbabbabbbb')) # 结果['a', 'ab', 'abb', 'abb', 'abb']

    # {n,m} 匹配n到m个,ab{1,3} 优先匹配最多的,然后依次递减,直到最后的字符
    # print(re.findall(r'ab{1,4}','aababbabbbabbbb')) # 结果['ab', 'abb', 'abbb', 'abbbb']


    # 特殊符号的重复
    # *:匹配0-无数个
    # print(re.findall(r'ab*','aababbabbbabbbb')) # 结果['a', 'ab', 'abb', 'abbb', 'abbbb']

    # +:匹配1到无数个
    # print(re.findall(r'ab+','aababbabbbabbbb')) # 结果['ab', 'abb', 'abbb', 'abbbb']

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

    # 案例。匹配所有单词
    # print(re.findall(r'[a-z]+','abc def hello print')) # 结果['abc', 'def', 'hello', 'print']

    # 案列,包含c的所有字符
    # print(re.findall(r'[a-z]*c','abc def hello acb zc'))


    # 代表单词边界,用空格(字符串的结尾也包括)作为匹配规则
    # print(re.findall(r'[a-z]+','abc def hello print')) # 结果['abc', 'def', 'hello', 'print']
    # 案例,以c字符结尾的字符
    # print(re.findall(r'[a-z]*c','abc def hello print acb zc')) # 结果['abc', 'zc']
    分组匹配
    url = 'http://www.baidu.com,http://www.youku.com'
    # 案例。要求拿到url的域名 baidu youku ()分组后,就之匹配出括号中的内容,其他不会输出
    print(re.findall(r'www.([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', 'baidu'), ('www.youku.com', 'www', 'w', 'youku')]


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

    # 专门处理分组的方法:分组,分组编号,有名分组,取消分组
    # 取消分组:必须写(),但是()为分组语法,我们只是想通过()将一些数据作为整体,所以必须加(),再取消分组
    # (?:) 取消分组,只是作为整体 (?P<名字>)有名分组
    url = 'www.baidu.com,www.youku.com'
    res = re.match(r'((?:www).(?P<name>[a-z]+).com)',url)
    print(res.group(1)) # 括号内的参数是位置参数,指向第几个分组 结果# www.baidu.com
    print(res.group(2)) # 结果 baidu
    print(res.group('name')) # 结果 baidu
    多行匹配
    s = """http://www.baidu.com
    https://sina.com.cn
    https://youku.com
    abchttp://www.oldboy.com
    """
    # 如果想将url链接都匹配出来-> 使用分组 使用()后,只会输出()中的内容
    print(re.findall(r'(?:https://|https://).+(?:com|cn)', s))
    # 判断以什么开头和结尾,使用分组组合判断,然后用?:来把分组功能解除,.是所有字符,而+号是相同字符出现的次数为无限个

    # ^代表以什么开头,¥代表以什么结尾,必须结合flags = re.M来完成多行匹配
    print(re.findall(r'^http.+com$', s, re.M))

    其他使用方法
    # 拆分,用空格拆分
    s = 'a b ac def'
    print(s.split(' '))

    # 正则拆分 中括号内加入你所需要分割的符号
    s = 'a b,ac@def'
    print(re.split(r'[ ,@]', s))

    # 正则替换,('目标字符','新字符',目标)
    s = 'python abc python'
    print(re.sub('python', 'Python', s))

    # 结合分组可以完成信息的重组与替换
    s = 'day a good!!!' # 新字符串 'a good good day!!!'
    print(re.sub('(day) (a) (good)', r'today is 2 3 3 1', s)) # 结果 today is a good good day!!!
    # 数字表示它的顺序
    正则匹配步骤
    #  如果需要匹配 这个字符,字符串前面必须带r 和一个 ,因为第一个会做转义字符使用,
    print(re.findall(r'\','adc\')) # 结果['\', '\', '\']
    # 而且  是具有特殊意义的字符,在匹配时,是匹配不到的,需要在目标字符串前加r 转成原义字符串
    print(re.findall(r'\',r'ac\')) # 结果['\', '\', '\', '\']

    print(re.findall(r' ', ' ')) # [' ']
    print(re.findall(r'd', 'd')) # []
    print(re.findall(r'\d', 'd')) # ['\d']

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

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

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

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


  • 相关阅读:
    SpringBoot进入debug模式
    windows上安装ElasticSearch
    Python操作Redis
    JVM: OOP模型 & 对象内存结构 & 计算对象大小 & 指针压缩 & 预估调优
    JVM:执行引擎&JIT&逃逸分析
    man -k或apropos报nothing appropriate解决办法
    JVM:String底层
    JVM: 内存模型
    JVM: 字节码解析
    mac不能启动finder的解决方案
  • 原文地址:https://www.cnblogs.com/liguodeboke/p/10841610.html
Copyright © 2011-2022 走看看