Python开发Day05

Python正则表达式:

  • 简介:

    • Python本身是没有正则表达式的,他是通过re模块来实现的。

    • Python的正则表达式(或 RE)是一种小型的、高度专业化的编程语言,它内嵌在Python中,并通过 re 模块实现。

  • 字符匹配

    • 元字符
      • . 通配符,除了换行符以外的任何字符,
        >>> re.findall('hell..word','hello word')
        ['hello word']
      • ^ 在字符串的开头满足条件。
        >>> re.findall('^hello','hello Wu,hello')
        ['hello']
      • $ 在字符串的结尾满足条件。
        >>> re.findall('hello$','hello Wu,hello')
        ['hello']
      • * ,重复出现0到多次,默认贪婪匹配,贪婪匹配就是从头匹配到结尾。

        >>> re.findall('hello*','hellooooooooooasd')
        ['helloooooooooo']
      • + 重复出现1到多次。
        >>> re.findall('hello+','hellooo')
        ['hellooo']
        >>> re.findall('hello+','hell')
        []
      • ? 出现0次或者1次。
        >>> re.findall('hello?','hell')
        ['hell']
        >>> re.findall('hello?','hello')
        ['hello']
        >>> re.findall('hello?','helloo')
        ['hello']
      • 字符集:
        • {} 匹配次数。
          >>> re.findall('hello{1,3}','helloo')#{}匹配1,3次
          ['helloo']
          >>> re.findall('hello{1,3}','helloooooo')
          ['hellooo']
        • [] 或者的意思[a-z]#匹配a-z的字母或者数字1-9、A-Z。[^a-z]#匹配不是小写字母a-z的字符。[\d]也可以使用
          >>> re.findall('hel[lo]x','helox')#匹配hellx或者helox
          ['helox']
        • () 和数学上的括号是一样的,属于组的概念。
          re.findall(r"(ab)*","aba")或者re.search(r'a(\d+)','a234234njka'),可以再a(\d+?)
        • |,也是或者的意思,具体看代码。
          >>> re.findall("a|c","aba")
          ['a', 'a']
        • \ 后面跟元字符就回去掉元字符的特殊功能,后面跟的普通字符实现特殊功能,在字符集中还是可以适应的
          • \2 #印用序号对应的组进行组成字符串
          • \d #匹配任何十进制的数(匹配一个)
          • \D #匹配任何非数字的字符
          • \w #匹配任何字母数字字符
          • \W #匹配任何非字母的数字字符
          • \s #匹配任何空白字符
          • \S #匹配任何非空白字符
  • Python正则的命令:

    • findall('找的内容','字符串或变量')    他匹配到的结果以列表的方式返回 
      >>> re.findall('hello','asdkhfjlsadhhellosafsdf')
      ['hello']
    • search('找的内容','字符串或变量')    找到一个符合标准的,多余的不再进行匹配,默认返回的是一个对象需要加.group()查看
      >>> re.search('hello','asdkhfjlsadhhellosafsdfhello').group()
      'hello'
    • match('规则','字符串','工作方式')    如果有结果会返回,如果没有结果返回None,默认返回的是一个对象需要加.group()查看

      >>> re.match(r'blow', 'blow123nlow')
      <_sre.SRE_Match object; span=(0, 4), match='blow'>
      >>> re.match(r'blow', 'blow123nlow').group()
      'blow'

       

      • 工作方式有:
        • re.I    不区分大小写
        • re.L       做本地化识别(locale-aware)匹配
        • re.M      多行匹配,影响 ^ 和 $
        • re.S       使 . 匹配包括换行在内的所有字符
      • match方法有:
        • group()     返回匹配开始的位置
        • start()      返回匹配开始的位置
        • end()        返回匹配结束的位置
        • span()      返回一个元组包含匹配 (开始,结束) 的位置
        • groups()      返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
    • sub(old,new,操作的字符串,替换次数)
      >>> re.sub("g.t","have",'I get A,  I got B ,I gut C')
      'I have A,  I have B ,I have C'
    • subn()      和sub差不多一样,只不过替换完成后会告诉我们替换了多少次
      >>> re.subn("g.t","have",'I get A,  I got B ,I gut C')
      ('I have A,  I have B ,I have C', 3)
    • compile()  编译   
      p = re.compile(r'\d+')
      p.split('one1two2three3four4')
    • split('规则','字符串') 使用规则分割字符串
      >>> re.split('\d+','one1two2three3four4')
      ['one', 'two', 'three', 'four', '']

       

Python常用模块:

  • 介绍

    • 模块就是用很多代码的组合来实现某一个功能的代码集合
    • 模块类似函数式编程和面向过程编程,函数式的编程是为了完成一个功能,让其他代码来调用,提供个代码的重用性和代码间的耦合,对于一些负责的功能来说的话,那么就会需要很多的函数才能完成,一个或一个以上的.py文件才能组成代码集合就成为模块
  • 模块分为三种:

    • 自定义模块
    • 内置标准模块(又称标准库)
    • 开源模块
  • 自定义模块:

    • 自定义模块就是所谓的自己写一个.py文件在另一个.py文件中导入。
      #模块
      print('hello word')
      例(模块)
      import hello#导入模块hello
      print('Wu')
      执行结果:
      hello word
      Wu
      列(调用)
  • 模块导入方法:

    • Python为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
      import module
      from module.xx.xx import xx
      from module.xx.xx import xx as rename   
      from module.xx.xx import *
    • 导入模块的过程就相当于是告诉Python去解释那个.py文件
      • 导入一个.py文件解释器解释该.py文件
      • 导入一个包,解释器解释这个包下面的__init__.py文件
    • 导入模块时的模块目录是怎么来进行找到模块文件的呢或者说是根据那个路径来进行的呢?这里我们可以使用sys.path
      import sys
      print(sys.path)
      执行结果:
      ['F:\\oldboy-Python\\py_code\\test', 'F:\\oldboy-Python', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Users\\吴永奇\\AppData\\Roaming\\Python\\Python35\\site-packages', 'C:\\Python35\\lib\\site-packages']
      sys模块的path

       但是结果中没有我们要导入的模块的路径怎么办?这时候后我么可以使用sys.path.append('路径')来向寻找模块的路径中添加一个路径。

      import sys
      sys.path.append('F:\\oldboy-Python\\py_code')
      print(sys.path)
      执行结果:
      ['F:\\oldboy-Python\\py_code\\test', 'F:\\oldboy-Python', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Users\\吴永奇\\AppData\\Roaming\\Python\\Python35\\site-packages', 'C:\\Python35\\lib\\site-packages', 'F:\\oldboy-Python\\py_code']
      View Code
  • 开源模块的下载和安装:

    • 我们怎么安装模块呢? 

      • 安装模块有两种方法提供:
        yum 
        pip
        apt-get
        ...
        方法一
        下载源码
        解压源码
        进入目录
        编译源码    python setup.py build
        安装源码    python setup.py install
        方法二
      • ps:在我们使用源码安装的时候,需要使用到gcc编译同时还需要Python的开发环境,所以需要先执行
        yum install gcc python-devel -y
        或者
        apt-get python-dev -y
      • 在模块安装完成后我们最好查看一个是否安装成功,安装成功的话会自动安装的sys.path中的某一个目录中,我们可以使用import 模块名 来看一下是否成功
    • 使用模块:

      • sys模块

        • sys.argv,命令行参数,第一个参数是程序本身的路径。
          import sys
          print(sys.argv)
          执行结果:
          F:\oldboy-Python\py_code\test>python noke.py hello
          ['noke.py', 'hello']
        • sys.exit(n),退出程序,我们可以定义退出时给用户一个提示。
          import sys
          sys.exit('Good bye!')
          执行结果:
          F:\oldboy-Python\py_code\test>python noke.py hello
          Good bye!
        • sys.version,查看Python的版本信息。
          import sys
          print(sys.version)
          执行结果:
          3.5.1rc1 (v3.5.1rc1:948ef16a6951, Nov 22 2015, 23:41:41) [MSC v.1900 64 bit (AMD64)]
        • sys.maxint,取最大的int值,在Python3.*后是sys.maxsize。
          #Python2.7
          import sys
          print(sys.maxint)
          执行结果:
          2147483647
          
          
          #Python3.5
          import sys
          print(sys.maxsize)
          执行结果:
          9223372036854775807
        • sys.path,返回模块的搜索路径,初始化的时候使用PYTHONPATH环境变量的值。
          import sys
          print(sys.path)
          执行结果:
          ['F:\\oldboy-Python\\py_code\\test', 'F:\\oldboy-Python', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Users\\吴永奇\\AppData\\Roaming\\Python\\Python35\\site-packages', 'C:\\Python35\\lib\\site-packages']
        • sys.platfrom,返回操作系统平台的名称

          import sys
          print(sys.platform)
          执行结果:
          win32
        • sys.stdout.write('内容'),向屏幕打印内容。
          sys.stdout.write('please:')
          执行结果:
          please:
        • sys.stdin.readline(),
      • time模块

        • time.time(),当前时间的时间戳
          >>> time.time()
          1463652160.4625852
        • time.ctime(),用字符串格式输出当前时间
          >>> time.ctime()
          'Thu May 19 18:05:20 2016'
        • time.ctime(time.time()-86400),用字符串格式输出当前时间-86400秒
          >>> time.ctime(time.time()-86400)
          'Wed May 18 18:05:40 2016'
        • time.gmtime(time.time()-86400),将UTC时间戳转换成对象格式输出,并减去86400秒,默认是UTC时区
          >>> time.gmtime(time.time()-86400)
          time.struct_time(tm_year=2016, tm_mon=5, tm_mday=18, tm_hour=10, tm_min=6, tm_sec=10, tm_wday=2, tm_yday=139, tm_isdst=0)
        • time.localtime(time.time()),将本地时间戳转换成对象格式输出
          >>> time.localtime(time.time())
          time.struct_time(tm_year=2016, tm_mon=5, tm_mday=19, tm_hour=18, tm_min=6, tm_sec=41, tm_wday=3, tm_yday=140, tm_isdst=0)
        • time.mktime(time.localtime()),将时间对象转成时间戳
          1 >>> time.mktime(time.localtime())
          2 1463652428.0
        • time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()),将时间对象转成字符串格式
          >>> time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())
          '2016-05-19 10:07:36'
        • time.strptime("2016-01-28","%Y-%m-%d"),将字符串格式转换成时间对象
          >>> time.strptime("2016-01-28","%Y-%m-%d")
          time.struct_time(tm_year=2016, tm_mon=1, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=28, tm_isdst=-1)
      • datetime模块

        • datetime.date.today(),输出当前的年月日
          import datetime
          print(datetime.date.today())
          执行结果:
          2016-05-19
        • datetime.date.fromtimestamp(time.time()-86400),将时间戳转成日期格式,并且减86400秒
          import datetime,time
          print(datetime.date.fromtimestamp(time.time()-86400))
          执行结果:
          2016-05-18
        • datetime.datetime.now(),输出当前时间
          import datetime,time
          print(datetime.datetime.now())
          执行结果:
          2016-05-19 18:19:37.266536
        • datetime.datetime.now().timetuple(),输出当前时间并将其转换成时间对象
          import datetime,time
          print(datetime.datetime.now().timetuple())
          执行结果:
          time.struct_time(tm_year=2016, tm_mon=5, tm_mday=19, tm_hour=18, tm_min=20, tm_sec=16, tm_wday=3, tm_yday=140, tm_isdst=-1)
        • datetime.datetime.now().replace(2014,9,12),输出当前时间,但是指定的年月日会被替换
          import datetime,time
          print(datetime.datetime.now().replace(2014,9,12))
          执行结果:
          2014-09-12 18:20:49.646533
        • datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M"),原时间,指定原时间格式
          import datetime,time
          print(datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M"))
          执行结果:
          2006-11-21 16:30:00
        • datetime.datetime.now() + datetime.timedelta(days=10),比现在的时间加10天
          import datetime
          print(datetime.datetime.now() + datetime.timedelta(days=10))
          执行结果:
          2016-05-29 18:21:57.771363
        • datetime.datetime.now() - datetime.timedelta(days=10),比现在的时间减10天,或者days=-10也可以
          import datetime,time
          print(datetime.datetime.now() - datetime.timedelta(days=10))
          执行结果:
          2016-05-09 18:22:29.773631
        • datetime.datetime.now() + datetime.timedelta(hours=10),比现在的时间加10小时
          import datetime,time
          print(datetime.datetime.now() + datetime.timedelta(hours=10))
          执行结果:
          2016-05-20 04:23:20.390089
        • datetime.datetime.now() + datetime.timedelta(weeks=1),比现在的时间加1周
          import datetime,time
          print(datetime.datetime.now() + datetime.timedelta(weeks=1))
          执行结果:
          2016-05-26 18:23:35.893500
        • datetime.datetime.now() + datetime.timedelta(minutes=12),比现在的时间加12分钟
          import datetime
          print(datetime.datetime.now() + datetime.timedelta(minutes=12))
          执行结果:
          2016-05-19 18:36:38.501280
        • datetime.datetime.now() + datetime.timedelta(milliseconds=10),比现在的时间加10毫秒
          import datetime
          print(datetime.datetime.now() + datetime.timedelta(milliseconds=10))
          执行结果:
          2016-05-19 18:25:02.996842
        • datetime.datetime.now() + datetime.timedelta(microseconds=14),比现在的时间加14微秒
          import datetime
          print(datetime.datetime.now() + datetime.timedelta(microseconds=14))
          执行结果:
          2016-05-19 18:25:38.922324
        • datetime.datetime.now() + datetime.timedelta(seconds=5),比现在的时间加5秒
          import datetime
          print(datetime.datetime.now() + datetime.timedelta(seconds=5))
          执行结果:
          2016-05-19 18:28:25.656614
      • json 和 pickle 模块:

        • 介绍:
          • 这两个模块用于序列化和反序列化
          • json,用于字符串 和 python数据类型间进行转换
          • pickle,用于python特有的类型 和 python的数据类型间进行转换
        • json和pickle模块提供的方法也都是一样的。
          • pickle模块提供了四个功能:dumps、dump、loads、load
            import pickle
            a=[1,2,3,4,5,6]
            b=pickle.dumps(a)#将数据通过特殊的方法转换为只有Python认识的字符串
            print(b)
            dumps
            import pickle
            a=[1,2,3,4,5,6]
            b=open('db','wb')
            pickle.dump(a,b)将数据通过特殊形式的转换,转换成只有Python认识的字符串。
            dump 
          • Json模块提供了四个功能:dumps、dump、loads、load
            import json
            a=[1,2,3,4,5,6]
            b=json.dumps(a)#通过特殊的处理将字符串转换为所有语言都认识的字符串
            print(b)
            dumps
            import json
            a=[1,2,3,4,5,6]
            b=open('db','w')
            json.dump(a,b)#通过特殊的处理将字符串转换为所有语言都认识的字符串,并写入文件
            dump
      • random

        • 介绍
          • random模块我们常用的也就是随机获取一个数字,经常拿它来做有关于随机的类型。
        • 方法
          • random.random(),随机获取一个浮点数
            import random
            print(random.random())
            执行结果:
            0.8696109071933436
            View Code
          • random.randint(1,2),获取一个随机数1或者2
            import random
            print(random.randint(1, 2))
            执行结果:
            1
            View Code
          • random.randrange(1,10),获取1到10随机数
            impoer random
            print(random.randrange(1, 10))
            执行结果:
            6
            View Code
        • 使用该模块做一个验证码
          import random#随机模块
          a=""#定义一个空的字符串
          for i in range(4):  #循环4次
              num = random.randrange(0,4)         #生成0-4的随机数
              if num == 3 :      #如果随机数是3那么就在验证码中生成一个0-9的数字
                  red2 = random.randrange(0,10)  #自行百度ascii码对照表
                  a = a + str(red2)#向a变量中添加当前数字对应的ascii码的字符
              elif num == 2 or num == 1:      #如果随机数等于2或者1的时候生成小写字母
                  red3=random.randrange(97,123)#自行百度ascii码对照表
                  a = a + chr(red3)#向a变量中添加当前数字对应的ascii码的字符
              else:           #在验证码中生成一个随机的大写字母
                  red1 = random.randrange(65,91)#自行百度ascii码对照表
                  a = a + chr(red1)#向a变量中添加当前数字对应的ascii码的字符
          print(a)#输出a变量
          验证码
      • os

        • 介绍:
          • 该模块用于操作系统
        • 方法:
          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')    获取文件/目录信息
          
          os.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
          
          os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
          
          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所指向的文件或者目录的最后修改时间

           

posted @ 2016-05-24 13:15  WuYongQi。  阅读(213)  评论(0编辑  收藏  举报