python基础9-re模块/logging模块/hashlib模块

  • re模块

  • 字符串.find是完全匹配,做不到模糊匹配,正则可以做到模糊匹配(管理身份证信息)
  • RE是小型的,高度专业化的编程语言,就是处理字符串,在其他语言中也可以引用正则表达式,引擎是c编写的,因此效率非常高
  • re包括元字符,和6个方法
  • 元字符:. ^ $  * + ? {} [] | () \
  1.   .  是通配符,可以代替所有的字符,除了\n不行。re.findall("a..x", "asdfkljlkxdf"),一个 . 代表一个字符
  2.  尖角号^ 是位于开头,re.findll("^a..x", "sadfasdf"),检测后边数据中是否存在a开头的对应字符串
  3. re.findall("a..x$", "sadfasldjf"),检测是否存在以ax结尾的字符串,把匹配结果放到列表中。
  • 四个重复符,都是贪婪匹配,都是尽可能匹配。加?变为惰性匹配
  1. re.findall("alex*", "asdfale"),匹配成功,因为*是0到正无穷个

  2. re.findall("alex+","sdafale"),匹配失败,因为+是1到正无穷

  3. re.findall("alex?","sadfalexxxx"),结果为alex,即匹配0个或1个x,如果后边只是ale,即返回ale

  4. {}能表示前边所有的情况,{0, }等价于*,  {1, }等价于+, {0,1}等价于?
  • 字符集[]
  1. re.findall("x[y,z]p", "xypuuuxzpux,pu"),[]中取一个,起‘或’的作用
  2. 在字符集[]中没有特殊符号,*就是*
  3. [a-z],是取a到z中任意一个,横杠在字符集中‘范围’的意思
  4. q.[^a-z],^在字符集中是‘非’的意思,只要不是就能匹配。提取最底层的括号:  re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))"
  5.  反斜杠\在字符集中用于,恢复(等符号在字符集中括号的作用。
  • 反斜杠\,叫转义符
  1. 反斜杠后边跟元字符去除特殊功能,比如\.     
  2. 反斜杠后边跟普通字符实现特殊功能,比如\d
    \w 匹配字母或数字或下划线或汉字
    \s 匹配任意的空白符。\S非空白
    \d 匹配任何十进制数字,相当于类[0-9]。\D是相反作用,匹配所有非数字字符。
    \b 匹配单词的开始或结束,特殊字符边界,如空格,&,#等,即\b等于这些特殊字符
  3.  \b的说明。
    1. re.findall(r"I\b","I am xxx"),如果不加r,python解释器会将处理\b的结果传给re模块,加上r则表示该字符串不需要处理,直接传给re
    2. 或者"I\\b",因为\在python中有特殊含义,\\表示去除其特殊含义
  4. re.findall("c\\\\|"),想匹配c\|。因为\在re模块有特殊意义,所以向\\去除特殊意义,向re传c\\|。为实现目标,在python中需要\\\\才能向re模块传入2个\\
  • 管道符|
  1. r"ka|b",是ka或b的意思
  • 分组()
  1. r."(abc)+",将abc作为整组进行匹配
  2. re.search("\d+", "asdjkhf34kjs76").group(),只返回34,即search只返回一个结果即可,返回的是一个对象
  3. re.search("(?P<name>[a-z]+)\d+","alex36wusir34"),将alex取出,并命名为name的对象,格式就是?P<>,分组用的。用在url路径匹配时
  • re.match("\d+", "56alex36wushis34")返回56,功能与search相同,但仅在字符串开始处匹配,.group()取出对象
  • re.split("[ab]","abc"),先按a分为 空 和 bc,空不能按b分,bc再按b分为 空 和 c,所以结果是 空 空 c
  • re.sub("\d","A","jask2353sdhfjk233",4),将前4个数字替换成A。不加参数4的情况下,全部替换为A
  • re.subn,将元素匹配成元组
  • com = re.comile("\d+")#将待匹配方法写到此处
    com.findall("fijksad23sdf234sdkj4")#原字符串
    #功能与findall相同,但可以用多次
  • ret = re.finditer("\d","sdfjh8977ksjdfkj98989")#将匹配内容作为迭代器
    next(ret).group#取出迭代对象
  • re.findall("www\.(?:baidu|163)\.com", "sdafhjwww.baidu.comsdkjfl"),findall优先将()中的内容拿出来。?:去优先级,返回网站全部
  • 同上,re.findall("(abc)+", "abcabcabc"),只输出一个abc,即优先把组里的内容打印出来。re.findall("(?:abc)+","abcabcabc"),去掉优先级,打印出abcabcabc
  • logging模块

  • 自己写日志,可以通过文件操作来完成
  • 日志级别。debug, Info, warning, error, critical,级别逐渐升高
  • logging.info或者.debug等方式调用日志信息
  • import logging
    
    logging.basicConfig(
         level = logging.DEBUG#将日志级别调整为debug
         filename = 'logger.log'#将日志写入此名字的文件,默认采用追加模式。
         filemode = 'w'#
    format="%(asctime)s %(filename)s",#将日志按照format的格式输出
    ) logging.debug('hello')#输出日志内容,在调试阶段,要看到所有信息 logging.info() logging.warning()#在上线阶段,只看warning级别之上,提高效率 logging.error() logging.critical()
  • stream:流的方式即写到终端上,加了firename后写到文件中。屏幕和文件只能选择一个显示
  • format参数中可能会用到的格式化串
  • logger对象
  1. 跟吸心大法特别像
  2. def logger():
    import logging
      logger=logging.getLogger()#创建一个吸心大法的低手。
    #()中无内容,则是root根用户,如有内容,则是root下的子用户。

    logger.setLevel("DEBUG")#设置logger的级别,debug就全部显示 fh=logging.FileHandler(test_log)#创建一个向文件test_log发送内容的高手 ch=logging.StreamHandler()#创建一个向屏幕发送内容的高手。如果注释掉,则不在屏幕显示,程序正常运行

    fm=logging.Formatter("%(asctime)s %(message)s")#定义输出格式

    fh.setFormatter(fm)#fh应用这种输出格式
    ch.setFormatter(fm)#如果注释掉,则按照默认格式显示
    logger.addHandler(fh)#学第一个技能 logger.addHandler(ch)#学第二个技能 

    return logger
    #然后用学会了吸心大法的人打印信息,向屏幕打印,同时向文件输出
    logger=logger()#调用logger函数

    logger.debug("debug")
    logger.info("info")
    logger.warning("warning")
    logger.error("error")
    logger.critical("critical")
  3. 如果在root下创建两个"my logger"的子用户,其实是一个,后边覆盖前边

  4. 一个日志py文件中,有父子两个logger,则打印子logger时,有几个上层在工作或者在输出,就重复打印几次,此举例中打印2次
  • configparser模块,配置解析模块

  • 为配置文件开发的,对配置文件进行操作
  • #配置文件基本格式,包括三部分,三个大key和value,大key的每个value又包括key和value
    [DEFAULT]#默认信息,在遍历其他信息时,都会输出这部分。default默认在其他key中也存在
    ServeAliveInterval=45#键值对
    Compression=yes
    CompressionLevel=9
    ForwardX11=yes
    
    [bitbucker.org]#另外一个键
    User=hg
    ServeAliveInterval=45#default这部分默认存在
    Compression=yes
    CompressionLevel=9
    ForwardX11=yes
    [topsecret.server.com] #另外一个键
    Port
    =5022 ForwardX11=no

     

  • #通过类字典操作来生成配置文件
    import configparser
    
    config=configparser.ConfigParser()
    #调用configparser类实例化出来一个对象。就相当于有个空字典config

    with open('example.ini','w') as f:
    #将文件命名为f
    config.write(f)#调用config的write方法,将配置写入文件中,与传统的f.write不同
  • config.get('bitbucket.org','compression'),是连续在两个key中取值,而字典的get第一个值是key,第二个值是没有key时的返回值

  • 最后写完配置文件,config.write(open('i.cfg','w')),将配置信息写入新文件i.cfg中。这种文件打开方式,不是fopen,不用关闭

  • hashlib模块,哈希模块

  • 摘要算法
  • 把一个不定长的内容,转化成定长的内容
    import hashlib
    
    obj=hashlib.md5("asdfhas".encode('utf-8'))#调用md5算法,给md5加盐,自己定义的
    obj.update("hello".encode("utf8"))#将字符串写成字节
    print(obj.hexdigest())#打印加密
    obj.update("root".encode("utf8"))#root是在hello基础上加密的
  •  一段字符串转成一个密文,且不能反解。

  • 只能全部变成密文后比较
  • 一般有sh256就可以了,要不断更新,没有一劳永逸的解
  • 模块补充

  • 多个py文件嵌套,路径搜索永远是执行文件的路径。
  • print(lhg.cal.add(1,2)),当前文件bin.py调用lhf.py, lhf.py调用cal.py中的add函数
posted @ 2022-01-14 19:52  线索  阅读(62)  评论(0编辑  收藏  举报