• Python常用模块-2


    本节目录

    • re
    • logging
    • os

    re

     re模块提供了正则表达式的相关操作

      是直接面向字符串的模糊匹配

      元字符包含有 . ^ $ * + ? {} [] | ()

       介绍字符

        .  通配符,除了换行符之外的任意字符

        ^   匹配字符串的开始

        $  匹配字符串的结尾

       关于次数的

        *  按紧挨着的字符重复无数次  重复零次或更多次    

        +  1到无穷次  重复一次或更多次

        ?  (0,1)  重复零次或一次

        {n}   重复n次
        {n,}  重复n次或更多次
        {n,m}重复n到m次

       其它的:

        [] 字符集  | 或  () 分组   转义  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    . ^ $ * + ? {} 一些用法
    import re
    print(re.findall("a..x","helloalex"))#['alex']  点匹配任意一个,但是只能匹配一个
     
    print(re.findall("^a..x","alexhelloworld"))#['alex'] ^ 匹配以什么开始
     
    print(re.findall("a..x$","helloalex"))#['alex'] $ 匹配以什么结尾
     
    print(re.findall("alex*","helloalexxxxx"))#['alexxxxx'] * 贪婪匹配 *表示匹配0次或更多次
     
    print(re.findall("alex+","helloalexxx"))#['alexxx'] +表示匹配1次或更多次
     
    print(re.findall("alex?","helloalexxxx"))#['alex'] ? 表示匹配0到1次
     
    print(re.findall("alex{1,2}","alexxxx"))#['alexx']

      注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    元字符之字符集[]
    存在或的关系    至少匹配一个   在字符集中含有特殊意义的只有三个 ^(非) (转义) -(范围)
     
    print(re.findall('a[bc]d','acd'))#['acd']  []字符集中有或的概念
     
    print(re.findall('[a-z]','acd'))#['a', 'c', 'd'] #范围a—z 都可以匹配到
     
    print(re.findall('[.*+]','a.cd+'))# ['.', '+']
     
    print(re.findall('[1-9]','45dha3'))# ['4', '5', '3']
     
    print(re.findall('[^ab]','45bdha3'))# ['4', '5', 'd', 'h', '3']   ^ 代表非的概念
     
    print(re.findall('[d]','45bdha3'))# ['4', '5', '3']  d 表示0到9的数字

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    关于转义的实例
    import re
    ret=re.findall('cl','abcle')
    print(ret)#[]
    ret=re.findall('c\l','abcle')
    print(ret)#[]
    ret=re.findall('c\\l','abcle')
    print(ret)#['c\l']
    ret=re.findall(r'c\l','abcle')
    print(ret)#['c\l']               # 一张图解释为什么要用到这么多 的原因

    1
    2
    3
    4
    5
    6
    7
    分组() 的用法
     
    print(re.findall(r'(ad)+', 'addad')) # ['ad', 'ad']
     
    ret=re.search('(?P<id>d{2})/(?P<name>w{3})','23/com')
    print(ret.group())#23/com
    print(ret.group('id'))#23

      

    1
    2
    3
    4
    |  或
     
    ret=re.search('(ab)|d','rabhdg8sd')
    print(ret.group())#ab    先匹配到哪个取哪个  group表示取值

    re下面的方法

      常用的功能函数包括:compile、search、match、split、findall(finditer)、sub(subn)

        comoile

    1
    2
    3
    obj=re.compile('d{5}')       # compile是编译的意思,编译好一个规则,再进行调用它
    ret=obj.search('abc12345ee')
    print(ret.group())#12345

        serch

    1
    2
    3
    4
    print(re.search('al','alvin yuan').group()) # al
     
    # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
    # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

        findall

    1
    2
    3
    print(re.findall('a','alvin yuan'))# ['a', 'a']
     
    # 返回所有满足匹配条件的结果,放在列表里

        match

    1
    2
    ret = re.match('a','abc').group() # match只是从开始匹配,匹配成功则返回对象
    print(ret)

        split

    1
    2
    ret=re.split('[ab]','abcd')     # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    print(ret)#['', '', 'cd']       # 结果放在列表中

        sub(subn)

    1
    2
    3
    4
    ret=re.sub('d','abc','alvin5yuan6',1)   # sub里面至少有个三个参数 依次是 匹配规则 替换内容 源数据     也可以有四个,最后一个参数是匹配次数
    print(ret)#alvinabcyuan6
    ret=re.subn('d','abc','alvin5yuan6')    # 显示匹配了多少次,替换
    print(ret)#('alvinabcyuanabc', 2)

        finditer

    1
    2
    3
    4
    5
    6
    ret=re.finditer('d','ds3sy4784a')
    print(ret)        #<callable_iterator object at 0x10195f940>
    print(next(ret).group())
    print(next(ret).group())
     
    # 结合迭代器规则,返回的是一个迭代器对象,应用于处理很多的数据,用next的可以逐一取

      ?:  是取消优先级         ?P的含义

    1
    2
    print(re.search("(?P<name>[a-z]+)(?P<age>d+)","alex36wusir27").group("name"))
    # alex 注释 ?P是定义死的 <定义分组名>                                 后面可根据分组名取值
    1
    2
    3
    4
    print(re.findall("www.(baidu|taobao).com","sdaswww.baidu.comsdf"))
    # ['baidu'] 优先给分组的内容,其实已经匹配到了
    print(re.findall("www.(?:baidu|taobao).com","sdaswww.baidu.comsdf"))
    # ['www.baidu.com']    ?: 表示去掉括号内的优先级

    logging

      用于便捷记录日志且线程安全的模块

      日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

      level=logging.DEBUG 设置日志级别

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import logging
     
    logging.basicConfig(filename='log.log',
                        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S %p',
                        level=logging.DEBUG)
     
    logging.debug('debug')            # 分五个等级
    logging.info('info')
    logging.warning('warning')
    logging.error('error')
    logging.critical('critical')
    logging.log(10,'log')

      文件输出如下

    format 设置输出格式

         %(levelno)s: 打印日志级别的数值
         %(levelname)s: 打印日志级别名称
         %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
         %(filename)s: 打印当前执行程序名
         %(funcName)s: 打印日志的当前函数
         %(lineno)d: 打印日志的当前行号
         %(asctime)s: 打印日志的时间
         %(thread)d: 打印线程ID
         %(threadName)s: 打印线程名称
         %(process)d: 打印进程ID
         %(message)s: 打印日志信息

    datefmt 设置日期格式,同 time.strftime()

          %Y 年 %m 月  %D日  %H时  %M分  %S 秒

    filename 设置文件路径

    filemode 设置文件打开模式 

    注:没有filename和filemode直接输出

     os

      用于提供系统级别的操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
    os.curdir                   返回当前目录: ('.')
    os.pardir                   获取当前目录的父目录字符串名:('..')
    os.makedirs('dir1/dir2')    可生成多层递归目录
    os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ***
    os.remove()                 删除一个文件
    os.rename("oldname","new")  重命名文件/目录 ***
    os.stat('path/filename')    获取文件/目录信息,相关信息的介绍 size 文件大小 atime 上次访问时间 mtime 上次修改时间 ctime 查看创建时间
    os.sep                      操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep                  当前平台使用的行终止符,win下为" ",Linux下为" "
    os.pathsep                  用于分割文件路径的字符串
    os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")   运行shell命令,直接显示
    os.environ                  获取系统环境变量
    os.path.abspath(path)       返回path规范化的绝对路径
    os.path.split(path)         将path分割成目录和文件名二元组返回
    os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path)      返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)         如果path是绝对路径,返回True
    os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,涉及文件路径拼接就用它
    os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

      

    上图所示,是得到

      os.path.dirname是返回上一级目录

      关于os模块的补充  

    os.walk(top, topdown=True, onerror=None, followlinks=False) 
    可以得到一个三元tupple(dirpath, dirnames, filenames), 
    第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
    dirpath 是一个string,代表目录的路径,
    dirnames 是一个list,包含了dirpath下所有子目录的名字。
    filenames 是一个list,包含了非目录文件的名字。
    这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).
    通过for循环自动完成递归枚举
    
    # 做个简单的例子,输出crm目录的下所有文件的路径信息
    for a,b,c in os.walk(str(PATH) + os.sep + "crm" ):
        for item in c:
            # print(item)
            print(os.path.join(a,item))
    
    输出
    F:pythoncrm.idea.name
    F:pythoncrm.ideacrm.iml
    F:pythoncrm.ideaencodings.xml
    F:pythoncrm.ideamisc.xml
    F:pythoncrm.ideamodules.xml
    F:pythoncrm.ideaworkspace.xml
    F:pythoncrminin.py
    F:pythoncrmin__init__.py
    F:pythoncrmin__pycache__in.cpython-35.pyc
    F:pythoncrmcoreadmin.py
    F:pythoncrmcorecoures.py
    F:pythoncrmcoregrade.py
    F:pythoncrmcoreschool.py
    F:pythoncrmcorestudent.py
    F:pythoncrmcore	eacher.py
    F:pythoncrmcore__init__.py
    F:pythoncrmcore__pycache__admin.cpython-35.pyc
    F:pythoncrmcore__pycache__coures.cpython-35.pyc
    F:pythoncrmcore__pycache__grade.cpython-35.pyc
    F:pythoncrmcore__pycache__school.cpython-35.pyc
    F:pythoncrmcore__pycache__student.cpython-35.pyc
    F:pythoncrmcore__pycache__	eacher.cpython-35.pyc
    F:pythoncrmcore__pycache____init__.cpython-35.pyc
    F:pythoncrmdbadminalex
    F:pythoncrmdbcoures23eeeb4347bdd26bfc6b7ee9a3b755dd
    F:pythoncrmdbcoures34d1f91fb2e514b8576fab1a75a89a6b
    F:pythoncrmdbcouresc71e8d17d41c21de0d260881d69662ff
    F:pythoncrmdbcouresdf5fb5e33c5585bb0c48107c57cece9b
    F:pythoncrmdbcourese206a54e97690cce50cc872dd70ee896
    F:pythoncrmdbgrade270c42ba7614f1a475f61dfcb397a621
    F:pythoncrmdbgrade817ee0b8010393ff3b4483e703663551
    F:pythoncrmdbschool17811d3caeff9648f48b5a553c806c63
    F:pythoncrmdbschool035c88ee6f5270ccff67a591d0e21ec
    F:pythoncrmdbschoolb0ac3d8eb8f2c2f6fe336c5e9957392
    F:pythoncrmdbschoole523d5f211747bdfc742f50463577f74
    F:pythoncrmdbstudent6e7e12c264fb3e1f456b0782f47e4af6
    F:pythoncrmdbstudenta0b5e2d3a97d7a19ec6d2da830f609b2
    F:pythoncrmdbstudenta995b03ed63f8c7128a83c984b89aa50
    F:pythoncrmdbstudentfe01b2ba5ec0146e5d4b0885822556ef
    F:pythoncrmdbstudentff4916088e836d268a9d72f8929bac06
    F:pythoncrmdb	eacher8319d4fed47c8ed828ebabd5a91563b
    F:pythoncrmdb	eacherd1d5cd3623144f692fb771580b92288
    F:pythoncrmdb	eacher5d00d0762936aedda519d63c2e4a2a40
    F:pythoncrmdb	eacher6a7ece82e4ed94a475dab275891d5036
    F:pythoncrmlibceshi.py
    F:pythoncrmlib
    eadme
    F:pythoncrmlib
    eadwrite.py
    F:pythoncrmlib__init__.py
    F:pythoncrmlib__pycache__
    eadwrite.cpython-35.pyc
    F:pythoncrmlib__pycache____init__.cpython-35.pyc
    用os.walk 遍历目录
    import os
    
    res = os.path.getsize(os.path.join("F:pythonPycharmProjectsdate2017.1.8","path_search.py"))
    print(res)
    
    ret  = os.stat(os.path.join("F:pythonPycharmProjectsdate2017.1.8","path_search.py")).st_size
    print(ret)
    
    f = open(os.path.join("F:pythonPycharmProjectsdate2017.1.8","path_search.py"),"rb")
    print(len(f.read()))
    
    输出结果相同
    获取文件大小的三种方式
  • 相关阅读:
    pytorch实现BiLSTM+CRF用于NER(命名实体识别)
    pytorch中如何处理RNN输入变长序列padding
    pytorch nn.LSTM()参数详解
    Pytorch的LSTM的理解
    转:pytorch版的bilstm+crf实现sequence label
    【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积
    iOS iphone5屏幕适配 autosizing
    IOS文件存储小结
    IIS6_IIS7日志文件位置
    xcode中没有autoSizing的设置
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/10547442.html
Copyright © 2020-2023  润新知