内置模块

  • python内部提供的功能
  • 导入模块后,直接使用即可

一、 random

  • 随机数模块

  • randint:得到一个随机数

  1. import random # 导入一个模块
  2. v = random.randint(起始,终止) # 得到一个随机数
  3. #示例:生成随机验证码
  4. import random
  5. def get_random_code(length=6):
  6. data = []
  7. for i in range(length):
  8. v = random.randint(65,90)
  9. data.append(chr(v))
  10. return ''.join(data)
  11. code = get_random_code()
  12. print(code)
  • uniform:生成一个随机小数
  • choice:抽取一个对象
    • 应用:验证码、抽奖
  • sample:抽取多个对象
    • 应用:一个奖项抽取多个人
  • shuffle:打乱顺序
    • 应用:洗牌、算法

二、 hashlib

  • 摘要算法模块

    • 密文验证
    • 校验文件的一致性
  • md5

  1. # 将指定的 “字符串” 进行 加密
  2. import hashlib # 导入一个模块
  3. def get_md5(data): # md5 加密函数
  4. obj = hashlib.md5()
  5. obj.update(data.encode('utf-8'))
  6. result = obj.hexdigest()
  7. return result
  8. val = get_md5('123')
  9. print(val)
  10. # 加盐
  11. import hashlib
  12. def get_md5(data):
  13. obj = hashlib.md5("sidrsdxff123ad".encode('utf-8')) # 加盐
  14. obj.update(data.encode('utf-8'))
  15. result = obj.hexdigest()
  16. return result
  17. val = get_md5('123')
  18. print(val)
  1. # 应用:用户注册+用户登录
  2. import hashlib
  3. USER_LIST = []
  4. def get_md5(data): # md5 加密函数
  5. obj = hashlib.md5("12:;idrsicxwersdfsaersdfs123ad".encode('utf-8')) # 加盐
  6. obj.update(data.encode('utf-8'))
  7. result = obj.hexdigest()
  8. return result
  9. def register(): # 用户注册函数
  10. print('**************用户注册**************')
  11. while True:
  12. user = input('请输入用户名:')
  13. if user == 'N':
  14. return
  15. pwd = input('请输入密码:')
  16. temp = {'username':user,'password':get_md5(pwd)}
  17. USER_LIST.append(temp)
  18. def login(): # 用户登录函数
  19. print('**************用户登陆**************')
  20. user = input('请输入用户名:')
  21. pwd = input('请输入密码:')
  22. for item in USER_LIST:
  23. if item['username'] == user and item['password'] == get_md5(pwd):
  24. return True
  25. register()
  26. result = login()
  27. if result:
  28. print('登陆成功')
  29. else:
  30. print('登陆失败')
  • sha

    1. import hashlib
    2. md5 = hashlib.sha1('盐'.encode())
    3. md5.update(b'str')
    4. print(md5.hexdigest())

三、 getpass

  • 只能在终端运行

  • getpass.getpass:输入密码时不显示

  1. import getpass # 导入一个模块
  2. pwd = getpass.getpass('请输入密码:')
  3. if pwd == '123':
  4. print('输入正确')

四、 time

  • 时间模块

  • time.time:时间戳(从1970年到现在经历的秒数)

    1. # https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4ZwIFHM6iw==&tip=1&r=-781028520&_=1555559189206
  • time.sleep:等待的秒数

  • time.timezone

  • 示例

    1. # 计算函数执行时间
    2. import time
    3. def wrapper(func):
    4. def inner():
    5. start_time = time.time()
    6. v = func()
    7. end_time = time.time()
    8. print(end_time-start_time)
    9. return v
    10. return inner
    11. @wrapper
    12. def func1():
    13. time.sleep(2)
    14. print(123)
    15. func1()

五、 datetime

  • 时间模块

  • datetime.now():当前本地时间

  • datetime.utcnow():当前UTC时间

    1. import time
    2. from datetime import datetime,timezone,timedelta
    3. # 获取datetime格式时间
    4. # 当前本地时间
    5. v1 = datetime.now()
    6. # 当前东7区时间
    7. tz = timezone(timedelta(hours=7))
    8. v2 = datetime.now(tz)
    9. # 当前UTC时间
    10. v3 = datetime.utcnow()
    11. print(v3)
  • 相互转换

    1. import time
    2. from datetime import datetime,timedelta
    3. # 1.datetime格式和字符串的相互转换
    4. # 把datetime格式转换成字符串:strftime
    5. v1 = datetime.now()
    6. val = v1.strftime("%Y-%m-%d %H:%M:%S")
    7. # 字符串转成datetime格式:strptime
    8. v1 = datetime.strptime('2011-11-11','%Y-%m-%d')
    9. # 2.datetime时间的加减
    10. v1 = datetime.strptime('2011-11-11','%Y-%m-%d')
    11. v2 = v1 - timedelta(days=140)
    12. # 再转换成字符串
    13. date = v2.strftime('%Y-%m-%d')
    14. # 3.时间戳和datetime的相互转换
    15. # 时间戳转换成datetime格式:fromtimestamp
    16. ctime = time.time()
    17. v1 = datetime.fromtimestamp(ctime)
    18. # datetime格式转换成时间戳:timestamp
    19. v1 = datetime.now()
    20. val = v1.timestamp()

六、 sys

  • python解释器相关数据

  • sys.getrefcount:获取一个值的应用计数

  • sys.getrecursionlimit:python默认支持的递归数量

  • sys.stdout.write:输入输出

    • 补充:\n:换行 \t:制表符 \r:回到当前行的起始位置

      1. import time
      2. for i in range(1,101):
      3. msg = "%s%%\r" %i
      4. print(msg,end='')
      5. time.sleep(0.05)
    • 示例:读取文件的进度条

    1. import os
    2. # 1. 读取文件大小(字节)
    3. file_size = os.stat('20190409_192149.mp4').st_size
    4. # 2.一点一点的读取文件
    5. read_size = 0
    6. with open('20190409_192149.mp4',mode='rb') as f1,open('a.mp4',mode='wb') as f2:
    7. while read_size < file_size:
    8. chunk = f1.read(1024) # 每次最多去读取1024字节
    9. f2.write(chunk)
    10. read_size += len(chunk)
    11. val = int(read_size / file_size * 100)
    12. print('%s%%\r' %val ,end='')
  • sys.argv:获取用户执行脚本时,传入的参数

    • 示例:让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删
    1. """
    2. 让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。
    3. C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test
    4. C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py
    5. """
    6. import sys
    7. # 获取用户执行脚本时,传入的参数。
    8. # C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test
    9. # sys.argv = [D:/code/s21day14/7.模块传参.py, D:/test]
    10. path = sys.argv[1]
    11. # 删除目录
    12. import shutil
    13. shutil.rmtree(path)
  • sys.exit(0):程序终止,0代表正常终止

  • sys.path:默认python去导入模块时,会按照sys.path中的路径

    • 添加目录:sys.path.append('目录')
    1. import sys
    2. sys.path.append('D:\\')
  • sys.modules:存储了当前程序中用到的所有模块,反射本文件中的内容

七、 os

  • 和操作系统相关的数据

  • os.path.exists(path):如果path存在,返回True;如果path不存在,返回False

  • os.stat('文件路径').st_size:获取文件大小

  • os.path.abspath():获取一个文件的绝对路径

    1. import os
    2. v1 = os.path.abspath(path)
    3. print(v1)
  • os.path.dirname():获取路径的上级目录

    1. import os
    2. v = r"D:\code\s21day14\20190409_192149.mp4"
    3. print(os.path.dirname(v))
    • 补充:转义

      1. v1 = r"D:\code\s21day14\n1.mp4" (推荐)
      2. v2 = "D:\\code\\s21day14\\n1.mp4"
  • os.path.join:路径的拼接

    1. import os
    2. path = "D:\code\s21day14" # user/index/inx/fasd/
    3. v = 'n.txt'
    4. result = os.path.join(path,v)
    5. print(result)
  • os.listdir:查看一个目录下所有的文件【第一层】

    1. import os
    2. result = os.listdir(r'D:\code\s21day14')
    3. for path in result:
    4. print(path)
  • os.walk:查看一个目录下所有的文件【所有层】

    1. import os
    2. result = os.walk(r'D:\code\s21day14')
    3. for a,b,c in result:
    4. # a,正在查看的目录 b,此目录下的文件夹 c,此目录下的文件
    5. for item in c:
    6. path = os.path.join(a,item)
    7. print(path)
  • os.makedir:创建目录,只能生产一层目录(基本不用这个)

  • os.makedirs:创建目录及其子目录(推荐使用)

    1. # 将内容写入指定文件中
    2. import os
    3. file_path = r'db\xx\xo\xxxxx.txt'
    4. file_folder = os.path.dirname(file_path)
    5. if not os.path.exists(file_folder):
    6. os.makedirs(file_folder)
    7. with open(file_path,mode='w',encoding='utf-8') as f:
    8. f.write('asdf')
  • os.rename:重命名

    1. # 将db重命名为sb
    2. import os
    3. os.rename('db','sb')
  • os.path.isdir:判断是否是文件夹

  • os.path.isfile:判断是否是文件

八、 shutil

  • 用途:删除、重命名、压缩、解压等

  • shutil.rmtree(path):删除目录

    1. # 删除目录
    2. import shutil
    3. shutil.rmtree(path)
  • shutil.move:重命名

    1. # 重命名
    2. import shutil
    3. shutil.move('test','ttt')
  • shutil.make_archive:压缩文件

    1. # 压缩文件
    2. import shutil
    3. shutil.make_archive('zzh','zip','D:\code\s21day16\lizhong')
  • shutil.unpack_archive:解压文件

    1. # 解压文件
    2. import shutil
    3. shutil.unpack_archive('zzh.zip',extract_dir=r'D:\code\xxxxxx\xxxx',format='zip')
  • 示例

    1. import os
    2. import shutil
    3. from datetime import datetime
    4. ctime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    5. # 1.压缩lizhongwei文件夹 zip
    6. # 2.放到到 code 目录(默认不存在)
    7. # 3.将文件解压到D:\x1目录中。
    8. if not os.path.exists('code'):
    9. os.makedirs('code')
    10. shutil.make_archive(os.path.join('code',ctime),'zip','D:\code\s21day16\lizhongwei')
    11. file_path = os.path.join('code',ctime) + '.zip'
    12. shutil.unpack_archive(file_path,r'D:\x1','zip')

九、 json

  • json是一个特殊的字符串,长得像列表/字典/字符串/数字等嵌套

  • 序列化:把python中的值转化为json格式的字符串

  • 反序列化:将json格式的字符串转换成python的数据类型

  • json格式要求:

    • 只包含 int / float / str / list / dict
    • 最外层必须是 list / dict
    • 在json中,内部str必须是双引号
    • 存在字典字典的key只能是str
    • 不能连续load多次
  • json.dumps():序列化

    • json只支持 dict / list / typle / str / int / float / True / False / None 序列化
    • 字典或列表中如果有中文,序列化时,如果想保留中文显示
    1. import json
    2. v = {'k1':'alex','k2':'李杰'}
    3. val = json.dumps(v,ensure_ascii = False)
  • json.loads():反序列化

    1. import json
    2. # 序列化,将python的值转换为json格式的字符串。
    3. v = [12,3,4,{'k1':'v1'},True,'asdf']
    4. v1 = json.dumps(v)
    5. print(v1)
    6. # 反序列化,将json格式的字符串转换成python的数据类型
    7. v2 = '["alex",123]'
    8. print(type(v2))
    9. v3 = json.loads(v2)
    10. print(v3,type(v3))
  • json.dump:打开文件,序列化后,写入文件

    1. import json
    2. v = {'k1':'alex','k2':'李杰'}
    3. f = open('x.txt',mode='w',encoding='utf-8')
    4. val = json.dump(v,f)
    5. print(val)
    6. f.close()
  • json.load:打开文件,读取文件内容

    1. import json
    2. v = {'k1':'alex','k2':'李杰'}
    3. f = open('x.txt',mode='r',encoding='utf-8')
    4. data = json.load(f)
    5. f.close()
    6. print(data,type(data))

十、 pickle

  • pickle与json的区别

    • json

      • 优点:所有语言通用
      • 缺点:只能序列化基本的数据类型 list/dict 等
    • pickle
      • 优点:python中所有的东西都能被他序列化(socket对象),支持连续load多次
      • 缺点:序列化的内容只有python认识
  • pickle.dumps:序列化

    • 序列化后的东西不可读
  • pickle.loads:反序列化

    1. import pickle
    2. # 序列化
    3. v = {1,2,3,4}
    4. val = pickle.dumps(v)
    5. print(val)
    6. # 反序列化
    7. data = pickle.loads(val)
    8. print(data,type(data))
  • pickle.dump:写入文件(注意:mode='wb')

  • pickle.load:读取文件(注意:mode='rb')

    1. import pickle
    2. # 写入文件
    3. v = {1,2,3,4}
    4. f = open('x.txt',mode='wb')
    5. val = pickle.dump(v,f)
    6. f.close()
    7. # 读取文件
    8. f = open('x.txt',mode='rb')
    9. data = pickle.load(f)
    10. f.close()
    11. print(data)

十一、 copy

  • 拷贝模块

  • copy.copy:浅拷贝

  • copy.deepcopy:深拷贝

    1. import copy
    2. v1 = [1,2,3]
    3. v2 = copy.copy(v1) #浅拷贝
    4. v3 = copy.deepcopy(v1) #深拷贝

十二、 importlib

  • importlib.import_module:通过字符串的形式导入模块

    1. #示例一:
    2. import importlib
    3. # 用字符串的形式导入模块。
    4. redis = importlib.import_module('utils.redis')
    5. # 用字符串的形式去对象(模块)找到他的成员。
    6. getattr(redis,'func')()
    7. #示例二:
    8. import importlib
    9. middleware_classes = [
    10. 'utils.redis.Redis',
    11. # 'utils.mysql.MySQL',
    12. 'utils.mongo.Mongo'
    13. ]
    14. for path in middleware_classes:
    15. module_path,class_name = path.rsplit('.',maxsplit=1)
    16. module_object = importlib.import_module(module_path)# from utils import redis
    17. cls = getattr(module_object,class_name)
    18. obj = cls()
    19. obj.connect()

十三、 logging

  • 日志模块:记录日志的

    • 给用户看的:流水类,如银行流水
    • 给程序员看的:
      • 统计用的
      • 用来做故障排除的,debug
      • 用来记录错误,完成代码的优化
  • 日志处理本质:Logger / FileHandler / Formatter

  • 两种配置方式:

    • basicConfig

      • 优点:使用方便
      • 缺点:不能实现编码问题,不能同时向文件和屏幕上输出
    • logger对象

      • 优点:能实现编码问题,能同时向文件和屏幕上输出
      • 缺点:复杂
      • 示例:
      1. import logging
      2. # 创建一个logger对象
      3. logger = logging.getLogger()
      4. # 创建一个文件操作符
      5. fh = logging.FileHandler('log.log')
      6. # 创建一个屏幕操作符
      7. sh = logging.StreamHandler()
      8. # 给logger对象绑定 文件操作符
      9. logger.addHandler(fh)
      10. # 给logger对象绑定 屏幕操作符
      11. logger.addHandler(sh)
      12. # 创建一个格式
      13. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      14. # 给文件操作符 设定格式
      15. fh.setFormatter(formatter)
      16. # 给屏幕操作符 设定格式
      17. sh.setFormatter(formatter)
      18. # 用logger对象来操作
      19. logger.warning('message')
  • 日志异常级别

    1. CRITICAL = 50 # 崩溃
    2. FATAL = CRITICAL
    3. ERROR = 40 # 错误
    4. WARNING = 30
    5. WARN = WARNING
    6. INFO = 20
    7. DEBUG = 10
    8. NOTSET = 0
  • 推荐处理日志方式

    1. import logging
    2. file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
    3. logging.basicConfig(
    4. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    5. datefmt='%Y-%m-%d %H:%M:%S %p',
    6. handlers=[file_handler,],
    7. level=logging.ERROR
    8. )
    9. logging.error('你好')
  • 推荐处理日志方式 + 日志分割

    1. import time
    2. import logging
    3. from logging import handlers
    4. # file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
    5. file_handler = handlers.TimedRotatingFileHandler(filename='x3.log', when='s', interval=5, encoding='utf-8')
    6. logging.basicConfig(
    7. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    8. datefmt='%Y-%m-%d %H:%M:%S %p',
    9. handlers=[file_handler,],
    10. level=logging.ERROR
    11. )
    12. for i in range(1,100000):
    13. time.sleep(1)
    14. logging.error(str(i))

    注意事项:

    1. # 在应用日志时,如果想要保留异常的堆栈信息。
    2. import logging
    3. import requests
    4. logging.basicConfig(
    5. filename='wf.log',
    6. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    7. datefmt='%Y-%m-%d %H:%M:%S %p',
    8. level=logging.ERROR
    9. )
    10. try:
    11. requests.get('http://www.xxx.com')
    12. except Exception as e:
    13. msg = str(e) # 调用e.__str__方法
    14. logging.error(msg,exc_info=True)

十四、 collections

  • OrderedDict:有序字典

    1. from collections import OrderedDict
    2. odic = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    3. print(odic)
    4. for k in odic:
    5. print(k,odic[k])
  • defaultdict:默认字典

  • deque:双端队列

  • namedtuple:可命名元组

    1. # 创建一个类,这个类没有方法,所有属性的值都不能修改
    2. from collections import namedtuple # 可命名元组
    3. Course = namedtuple('Course',['name','price','teacher'])
    4. python = Course('python',19800,'alex')
    5. print(python)
    6. print(python.name)
    7. print(python.price)

十五、 re

15.1 正则表达式

  • 定义

  • 定义:正则表达式是一种规则匹配字符串的规则

  • re模块本身只是用来操作正则表达式的,和正则本身没关系

  • 为什么要有正则表达式?

    • 匹配字符串

      • 一个人的电话号码
      • 一个人的身份证号
      • 一台机器的ip地址
    • 表单验证
      • 验证用户输入的信息是否准确
      • 银行卡号
    • 爬虫
      • 从网页源码中获取一些链接、重要数据
  • 正则规则

  • 第一条规则 : 本身是哪一个字符,就匹配字符串中的哪一个字符

  • 第二条规则 : 字符组[字符1字符2],一个字符组就代表匹配一个字符,只要这个字符出现在字符组里,那么就说明这个字符能匹配上

    • 字符组中还可以使用范围
    • 所有的范围都必须遵循ascii码从下到大来指定
    • 常用:[0-9] [a-z] [A-Z]
  • 元字符

  • \d:表示所有的数字

    • \是转义符 转义符转义了d,让d能够匹配所有0-9之间的数
  • \w:表示大小写字母、数字、下划线

  • \s:表示空白、空格、换行符、制表符

  • \t:匹配制表符

  • \n:匹配换行符

  • \D:表示所有的非数字

  • \W:表示除数字、字母、下划线之外的所有字符

  • \S:表示非空白

  • . :表示除了换行符之外的任意内容

  • [] 字符组:只要在中括号内的所有字符都是符合规则的字符

  • [^ ]非字符组:只要在中括号内的所有字符都是不符合规则的字符

  • ^:表示一个字符的开始

  • $:表示一个字符的结束

  • |:表示或

    • 注意:如果两个规则有重叠部分,总是长的在前面,短的在后面
  • ():表示分组,给一部分正则规定为一组,|这个符号的作用域就可以缩小了

  • 特殊:

    • [\d]、[0-9]、\d:没有区别 都是要匹配一位数字
    • [\d\D]、[\W\w]、[\S\s] 匹配所有一切字符
  • 量词

  • {n}:表示只能出现n次

  • {n,}:表示至少出现n次

  • {n,m}:表示至少出现n次,至多出现m次

  • ?:表示匹配0次或1次,表示可有可无,但是有只能有一个,比如小数点

  • +:表示匹配1次或多次

  • *:表示匹配0次或多次,表示可有可无,但是有可以有多个比如小数点后n位

  • 匹配0次出现的情况:

    • 匹配任意的保留两位小数的数字
    • 匹配一个整数或者小数
  • 贪婪匹配

  • 默认贪婪匹配,总是会在符合量词条件的范围内尽量多匹配

  • 非贪婪匹配 :惰性匹配

    • 总是匹配符合条件范围内尽量小的字符串
    • 格式:元字符 量词 ? x
      • 表示按照元字符规则在量词范围内匹配,一旦遇到x就停止
      • 示例:.*?x 匹配任意的内容任意多次遇到x就立即停止
  • 转义符:\

  • 正则表达式中的转义符在python的字符串中也刚好有转移的作用

  • 但是正则表达式中的转义符和字符串中的转义符并没关系,且还容易有冲突

  • 为了避免这种冲突,我们所有的正则都以在工具中的测试结果为结果

  • 然后只需要在正则和待匹配的字符串外面都加r即可

  1. 邮箱规则
  2. @之前必须有内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.)
  3. @和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着
  4. 最后一个点(.)之后必须有内容且内容只能是字母(大小写)、数字且长度为大于等于2个字节,小于等于6个字节
  5. 邮箱验证的正则表达式:
  6. ^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$

15.2 正则模块

  • re.findall:会匹配字符串中所有符合规则的项,并返回一个列表,如果没匹配到,返回空列表

    1. import re
    2. ret = re.findall('\d+','alex83')
    3. print(ret)
    4. # findall 会匹配字符串中所有符合规则的项
    5. # 并返回一个列表
    6. # 如果未匹配到返回空列表
  • re.search:如果匹配到,返回一个对象,用group取值,如果没匹配到,返回None,不能用group

    1. import re
    2. ret = re.search('\d+','alex83')
    3. print(ret) # 如果能匹配上返回一个对象,如果不能匹配上返回None
    4. if ret:
    5. print(ret.group()) # 如果是对象,那么这个对象内部实现了group,所以可以取值
    6. # 如果是None,那么这个对象不可能实现了group方法,所以报错
    7. # 会从头到尾从带匹配匹配字符串中取出第一个符合条件的项
    8. # 如果匹配到了,返回一个对象,用group取值
    9. # 如果没匹配到,返回None,不能用group
  • re.match:match = search + ^正则

    1. import re
    2. ret = re.match('\d','alex83') == re.match('^\d','alex83')
    3. print(ret)
    4. # 会从头匹配字符串,从第一个字符开始是否符合规则
    5. # 如果符合,就返回对象,用group取值
    6. # 如果不符合,就返回None
  • re.finditer:在查询的结果超过1个的情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间复杂度

    1. import re
    2. ret = re.finditer('\d','safhl02urhefy023908'*20000000) # ret是迭代器
    3. for i in ret: # 迭代出来的每一项都是一个对象
    4. print(i.group()) # 通过group取值即可
  • re.compile:在同一个正则表达式重复使用多次的时候使用能够减少时间的开销

    1. import re
    2. ret = re.compile('\d+')
    3. r1 = ret.search('alex83')
    4. r2 = ret.findall('wusir74')
    5. r3 = ret.finditer('taibai40')
    6. for i in r3:
    7. print(i.group())
  • re.split:利用正则规则进行切割

    1. import re
    2. ret = re.split('\d(\d)','alex83wusir74taibai') # 默认自动保留分组中的内容
    3. print(ret)
  • re.sub / re.subn:利用正则规则进行替换

    1. import re
    2. ret = re.sub('\d','D','alex83wusir74taibai',1)
    3. print(ret) # 'alexD3wusir74taibai'
    4. ret = re.subn('\d','D','alex83wusir74taibai')
    5. print(ret) # ('alexDDwusirDDtaibai', 4)
  • 分组和re模块

  • 关于group取值

    1. import re
    2. ret = re.search('<(\w+)>(.*?)</\w+>',s1)
    3. print(ret)
    4. print(ret.group(0)) # group参数默认为0 表示取整个正则匹配的结果
    5. print(ret.group(1)) # 取第一个分组中的内容
    6. print(ret.group(2)) # 取第二个分组中的内容
  • 分组命名:(?P<名字>正则表达式)

    1. import re
    2. ret = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1)
    3. print(ret)
    4. print(ret.group('tag')) # 取tag分组中的内容
    5. print(ret.group('cont')) # 取cont分组中的内容
  • 引用分组:(?P=组名) 这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样

    1. import re
    2. # 方法一:
    3. s = '<h1>wahaha</h1>'
    4. ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s)
    5. print(ret.group('tag')) # 'h1'
    6. # 方法二:
    7. s = '<h1>wahaha</h1>'
    8. ret = re.search(r'<(\w+)>.*?</\1>',s)
    9. print(ret.group(1)) # 'h1'
  • 分组和findall:默认findall 优先显示分组内的内容,取消分组优先显示 :(?:正则)

    1. import re
    2. ret = re.findall('\d(\d)','aa1alex83')
    3. # findall遇到正则表达式中的分组,会优先显示分组中的内容
    4. print(ret)
    5. # 取消分组优先显示:
    6. ret = re.findall('\d+(?:\.\d+)?','1.234+2')
    7. print(ret)
  • 有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉

    1. import re
    2. ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
    3. print(ret) # ['1', '2', '60', '', '5', '4', '3']
    4. ret.remove('')
    5. print(ret) # ['1', '2', '60', '5', '4', '3']
  • 爬虫示例

    1. # 方法一:
    2. import re
    3. import json
    4. import requests
    5. def parser_page(par,content):
    6. res = par.finditer(content)
    7. for i in res:
    8. yield {'id': i.group('id'),
    9. 'title': i.group('title'),
    10. 'score': i.group('score'),
    11. 'com_num': i.group('comment_num')}
    12. def get_page(url):
    13. ret = requests.get(url)
    14. return ret.text
    15. pattern = '<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<title>.*?)</span>.*?' \
    16. '<span class="rating_num".*?>(?P<score>.*?)</span>.*?<span>(?P<comment_num>.*?)人评价</span>'
    17. par = re.compile(pattern,flags=re.S)
    18. num = 0
    19. with open('movie_info',mode = 'w',encoding='utf-8') as f:
    20. for i in range(10):
    21. content = get_page('https://movie.douban.com/top250?start=%s&filter=' % num)
    22. g = parser_page(par,content)
    23. for dic in g:
    24. f.write('%s\n'%json.dumps(dic,ensure_ascii=False))
    25. num += 25
    1. # 方法二:进阶
    2. import re
    3. import json
    4. import requests
    5. def parser_page(par,content):
    6. res = par.finditer(content)
    7. for i in res:
    8. yield {'id': i.group('id'),
    9. 'title': i.group('title'),
    10. 'score': i.group('score'),
    11. 'com_num': i.group('comment_num')}
    12. def get_page(url):
    13. ret = requests.get(url)
    14. return ret.text
    15. def write_file(file_name):
    16. with open(file_name,mode = 'w',encoding='utf-8') as f:
    17. while True:
    18. dic = yield
    19. f.write('%s\n' % json.dumps(dic, ensure_ascii=False))
    20. pattern = '<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<title>.*?)</span>.*?' \
    21. '<span class="rating_num".*?>(?P<score>.*?)</span>.*?<span>(?P<comment_num>.*?)人评价</span>'
    22. par = re.compile(pattern,flags=re.S)
    23. num = 0
    24. f = write_file('move2')
    25. next(f)
    26. for i in range(10):
    27. content = get_page('https://movie.douban.com/top250?start=%s&filter=' % num)
    28. g = parser_page(par,content)
    29. for dic in g:
    30. f.send(dic)
    31. num += 25
    32. f.close()

s21day20 python笔记的更多相关文章

  1. Python笔记之不可不练

    如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...

  2. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  3. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

  4. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  5. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  6. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  7. python笔记 - day8

    python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...

  8. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

  9. python笔记 - day7

    python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...

随机推荐

  1. 数据分析---SQL(删除数据或表)

    一.SQL中的语法 1.drop table 表名称                         eg: drop table  dbo.Sys_Test   2.truncate table 表 ...

  2. MySql数据库通过idb和frm恢复

    简单粗暴 恢复user表 1.先建立和之前user表一样的表结构.就是执行create table user .... ,执行完,数据库目录下就会建立user.ibd文件(当然还有其他的) 2.执行 ...

  3. mysql排序之ORDER BY IF、ORDER BY配合IN、TIMESTAMPDIFF、TIMESTAMPADD、FIELD

    1.order by if 排序 SELECT * FROM pet ORDER BY if (species='snake',0,1),species;--species为snake的行数放置到了查 ...

  4. 常用的lamp环境以及一些依赖包的安装

  5. redis持久化数据的机制——转发

    转载:https://www.cnblogs.com/xingzc/p/5988080.html Redis提供的持久化机制(RDB和AOF)   Redis提供的持久化机制 Redis是一种面向“k ...

  6. QT学习教程

    原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...

  7. tensorflow安装排坑笔记

    由于项目需求,得用tensorflow完成,只能将mxnet的学习先放在一边,开始用tensorflow,废话不多说 首先安装anaconda+vs2015+cuda8.0+cudnn6.0 首先安装 ...

  8. 1.2 JAVA多线程实现

    线程和进程 进程:是执行中一段程序, 进程是系统进行资源分配和调度的一个独立单位. 线程:比进程更小的能独立运行的基本单位,单个进程中执行中每个任务就是一个线程.线程是进程中执行运算的最小单位. Th ...

  9. 从SQLServer转储数据到MySQL

    前一段时间,由于项目需要将数据库从SQLServer迁移到MySQL,在网上百度了很久,基本都是通过SQLyog实现的.其实使用平时常用的数据库管理软件Navicat Premium也能做到,并且操作 ...

  10. MySQL数据库--思维导图

    MySQL数据库--思维导图