我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python常见的内置模块

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python常见的内置模块

内置模块

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

一、 random

  • 随机数模块
  1. randint:得到一个随机数
import random    # 导入一个模块 
v = random.randint(起始,终止)    # 得到一个随机数

#示例:生成随机验证码
import random     
def get_random_code(length=6):
    data = []
    for i in range(length):
        v = random.randint(65,90)
        data.append(chr(v))
    return  ''.join(data)

code = get_random_code()
print(code)
  1. uniform:生成一个随机小数
  2. choice:抽取一个对象
    • 应用:验证码、抽奖
  3. sample:抽取多个对象
    • 应用:一个奖项抽取多个人
  4. shuffle:打乱顺序
    • 应用:洗牌、算法

二、 hashlib

  • 摘要算法模块
    • 密文验证
    • 校验文件的一致性
  1. md5
# 将指定的 “字符串” 进行 加密
import hashlib     # 导入一个模块
def get_md5(data):          # md5 加密函数  
    obj = hashlib.md5()
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
val = get_md5('123')
print(val)

# 加盐
import hashlib
def get_md5(data):
    obj = hashlib.md5("sidrsdxff123ad".encode('utf-8'))            # 加盐
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
val = get_md5('123')
print(val)
# 应用:用户注册+用户登录
import hashlib
USER_LIST = []
def get_md5(data):                   # md5 加密函数 
    obj = hashlib.md5("12:;idrsicxwersdfsaersdfs123ad".encode('utf-8'))         # 加盐
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

def register():                      # 用户注册函数
    print('**************用户注册**************')
    while True:
        user = input('请输入用户名:')
        if user == 'N':
            return
        pwd = input('请输入密码:')
        temp = {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)

def login():                          # 用户登录函数
    print('**************用户登陆**************')
    user = input('请输入用户名:')
    pwd = input('请输入密码:')
    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True

register()
result = login()
if result:
    print('登陆成功')
else:
    print('登陆失败')
  1. sha

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

三、 getpass

  • 只能在终端运行
  1. getpass.getpass:输入密码时不显示
import getpass        # 导入一个模块
pwd = getpass.getpass('请输入密码:')
if pwd == '123':
    print('输入正确')

四、 time

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

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

  3. time.timezone

  • 示例

    # 计算函数执行时间
    import time
    def wrapper(func):
        def inner():
            start_time = time.time()
            v = func()
            end_time = time.time()
            print(end_time-start_time)
            return v
        return inner
    @wrapper
    def func1():
        time.sleep(2)
        print(123)   
    func1()

五、 datetime

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

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

    import time
    from datetime import datetime,timezone,timedelta
    # 获取datetime格式时间
    # 当前本地时间
    v1 = datetime.now() 
    
    # 当前东7区时间
    tz = timezone(timedelta(hours=7)) 
    v2 = datetime.now(tz)
    
    # 当前UTC时间
    v3 = datetime.utcnow() 
    print(v3)
  • 相互转换

    import time
    from datetime import datetime,timedelta
    # 1.datetime格式和字符串的相互转换
    # 把datetime格式转换成字符串:strftime
    v1 = datetime.now()
    val = v1.strftime("%Y-%m-%d %H:%M:%S")
    # 字符串转成datetime格式:strptime
    v1 = datetime.strptime('2011-11-11','%Y-%m-%d')
    
    # 2.datetime时间的加减
    v1 = datetime.strptime('2011-11-11','%Y-%m-%d')
    v2 = v1 - timedelta(days=140)
    # 再转换成字符串
    date = v2.strftime('%Y-%m-%d')
    
    # 3.时间戳和datetime的相互转换
    # 时间戳转换成datetime格式:fromtimestamp
    ctime = time.time()
    v1 = datetime.fromtimestamp(ctime)
    # datetime格式转换成时间戳:timestamp
    v1 = datetime.now()
    val = v1.timestamp()

六、 sys

  • python解释器相关数据
  1. sys.getrefcount:获取一个值的应用计数

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

  3. sys.stdout.write:输入输出

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

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

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

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

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

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

七、 os

  • 和操作系统相关的数据
  1. os.path.exists(path):如果path存在,返回True;如果path不存在,返回False

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

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

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

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

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

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

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

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

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

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

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

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

八、 shutil

  • 用途:删除、重命名、压缩、解压等
  1. shutil.rmtree(path):删除目录

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

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

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

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

    import os
    import shutil
    from datetime import datetime
    ctime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    # 1.压缩lizhongwei文件夹 zip
    # 2.放到到 code 目录(默认不存在)
    # 3.将文件解压到D:\x1目录中。
    if not os.path.exists('code'):
        os.makedirs('code')
    shutil.make_archive(os.path.join('code',ctime),'zip','D:\code\s21day16\lizhongwei')
    
    file_path = os.path.join('code',ctime) + '.zip'
    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多次
  1. json.dumps():序列化

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

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

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

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

十、 pickle

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

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

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

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

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

十一、 copy

  • 拷贝模块
  1. copy.copy:浅拷贝

  2. copy.deepcopy:深拷贝

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

十二、 importlib

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

    #示例一:
    import importlib
    # 用字符串的形式导入模块。
    redis = importlib.import_module('utils.redis')
    
    # 用字符串的形式去对象(模块)找到他的成员。
    getattr(redis,'func')()
    
    #示例二:
    import importlib
    middleware_classes = [
        'utils.redis.Redis',
        # 'utils.mysql.MySQL',
        'utils.mongo.Mongo'
    ]
    for path in middleware_classes:
        module_path,class_name = path.rsplit('.',maxsplit=1)
        module_object = importlib.import_module(module_path)# from utils import redis
        cls = getattr(module_object,class_name)
        obj = cls()
        obj.connect()

十三、 logging

  • 日志模块:记录日志的

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

  • 两种配置方式:

    • basicConfig

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

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

    CRITICAL = 50       # 崩溃
    FATAL = CRITICAL
    ERROR = 40          # 错误
    WARNING = 30
    WARN = WARNING
    INFO = 20
    DEBUG = 10
    NOTSET = 0
  • 推荐处理日志方式

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

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

    注意事项:

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

十四、 collections

  1. OrderedDict:有序字典

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

  3. deque:双端队列

  4. namedtuple:可命名元组

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

十五、 re

15.1 正则表达式

  1. 定义
  • 定义:正则表达式是一种规则匹配字符串的规则
  • re模块本身只是用来操作正则表达式的,和正则本身没关系
  • 为什么要有正则表达式?
    • 匹配字符串
      • 一个人的电话号码
      • 一个人的身份证号
      • 一台机器的ip地址
    • 表单验证
      • 验证用户输入的信息是否准确
      • 银行卡号
    • 爬虫
      • 从网页源码中获取一些链接、重要数据
  1. 正则规则
  • 第一条规则 : 本身是哪一个字符,就匹配字符串中的哪一个字符
  • 第二条规则 : 字符组[字符1字符2],一个字符组就代表匹配一个字符,只要这个字符出现在字符组里,那么就说明这个字符能匹配上
    • 字符组中还可以使用范围
    • 所有的范围都必须遵循ascii码从下到大来指定
    • 常用:[0-9] [a-z] [A-Z]
  1. 元字符
  • \d:表示所有的数字
    • \是转义符 转义符转义了d,让d能够匹配所有0-9之间的数
  • \w:表示大小写字母、数字、下划线
  • \s:表示空白、空格、换行符、制表符
  • \t:匹配制表符
  • \n:匹配换行符
  • \D:表示所有的非数字
  • \W:表示除数字、字母、下划线之外的所有字符
  • \S:表示非空白
  • . :表示除了换行符之外的任意内容
  • [] 字符组:只要在中括号内的所有字符都是符合规则的字符
  • [^ ]非字符组:只要在中括号内的所有字符都是不符合规则的字符
  • ^:表示一个字符的开始
  • $:表示一个字符的结束
  • |:表示或
    • 注意:如果两个规则有重叠部分,总是长的在前面,短的在后面
  • ():表示分组,给一部分正则规定为一组,|这个符号的作用域就可以缩小了
  • 特殊:
    • [\d]、[0-9]、\d:没有区别 都是要匹配一位数字
    • [\d\D]、[\W\w]、[\S\s] 匹配所有一切字符
  1. 量词
  • {n}:表示只能出现n次
  • {n,}:表示至少出现n次
  • {n,m}:表示至少出现n次,至多出现m次
  • ?:表示匹配0次或1次,表示可有可无,但是有只能有一个,比如小数点
  • +:表示匹配1次或多次
  • *:表示匹配0次或多次,表示可有可无,但是有可以有多个比如小数点后n位
  • 匹配0次出现的情况:
    • 匹配任意的保留两位小数的数字
    • 匹配一个整数或者小数
  1. 贪婪匹配
  • 默认贪婪匹配,总是会在符合量词条件的范围内尽量多匹配
  • 非贪婪匹配 :惰性匹配
    • 总是匹配符合条件范围内尽量小的字符串
    • 格式:元字符 量词 ? x
      • 表示按照元字符规则在量词范围内匹配,一旦遇到x就停止
      • 示例:.*?x 匹配任意的内容任意多次遇到x就立即停止
  1. 转义符:
  • 正则表达式中的转义符在python的字符串中也刚好有转移的作用
  • 但是正则表达式中的转义符和字符串中的转义符并没关系,且还容易有冲突
  • 为了避免这种冲突,我们所有的正则都以在工具中的测试结果为结果
  • 然后只需要在正则和待匹配的字符串外面都加r即可
邮箱规则
@之前必须有内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.)
@和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着
最后一个点(.)之后必须有内容且内容只能是字母(大小写)、数字且长度为大于等于2个字节,小于等于6个字节

邮箱验证的正则表达式:
^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$

15.2 正则模块

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

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

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

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

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

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

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

    import re
    ret = re.sub('\d','D','alex83wusir74taibai',1)
    print(ret)      # 'alexD3wusir74taibai'
    
    ret = re.subn('\d','D','alex83wusir74taibai')
    print(ret)      # ('alexDDwusirDDtaibai', 4)
  • 分组和re模块
  1. 关于group取值

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

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

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

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

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

    # 方法一:
    import re
    import json
    import requests
    
    def parser_page(par,content):
        res = par.finditer(content)
        for i in res:
            yield {'id': i.group('id'),
                   'title': i.group('title'),
                   'score': i.group('score'),
                   'com_num': i.group('comment_num')}
    
    def get_page(url):
        ret = requests.get(url)
        return  ret.text
    
    
    pattern = '<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<title>.*?)</span>.*?' \
                  '<span class="rating_num".*?>(?P<score>.*?)</span>.*?<span>(?P<comment_num>.*?)人评价</span>'
    par = re.compile(pattern,flags=re.S)
    num = 0
    with open('movie_info',mode = 'w',encoding='utf-8') as f:
        for i in range(10):
            content = get_page('https://movie.douban.com/top250?start=%s&filter=' % num)
            g = parser_page(par,content)
            for dic in g:
                f.write('%s\n'%json.dumps(dic,ensure_ascii=False))
            num += 25
    # 方法二:进阶
    import re
    import json
    import requests
    
    def parser_page(par,content):
        res = par.finditer(content)
        for i in res:
            yield {'id': i.group('id'),
                   'title': i.group('title'),
                   'score': i.group('score'),
                   'com_num': i.group('comment_num')}
    
    def get_page(url):
        ret = requests.get(url)
        return  ret.text
    
    def write_file(file_name):
        with open(file_name,mode = 'w',encoding='utf-8') as f:
            while True:
                dic = yield
                f.write('%s\n' % json.dumps(dic, ensure_ascii=False))
    
    pattern = '<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<title>.*?)</span>.*?' \
                  '<span class="rating_num".*?>(?P<score>.*?)</span>.*?<span>(?P<comment_num>.*?)人评价</span>'
    par = re.compile(pattern,flags=re.S)
    num = 0
    f = write_file('move2')
    next(f)
    for i in range(10):
        content = get_page('https://movie.douban.com/top250?start=%s&filter=' % num)
        g = parser_page(par,content)
        for dic in g:
            f.send(dic)
        num += 25
    f.close()

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python常见的内置模块

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python常见的内置模块

内置模块python内部提供的功能导入模块后,直接使用即可一、 random随机数模块randint:得到一个随机数import random # 导入一个模块 v = random.randint(起始,终止) # 得到一个随
2023-01-31

Python中内置模块的常见问题及解决策略

Python中内置模块的常见问题及解决策略引言:Python作为一种简单易学且功能强大的编程语言,其内置模块提供了众多常用的功能和工具。然而,正因为其广泛使用,一些常见的问题也会随之出现。本文将介绍一些Python内置模块的典型问题,并提供
2023-10-22

Python常用内置模块之xml模块(详解)

xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。从结构上,很像HTML超文本标记语言。但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观。它被设计用来传
2022-06-04

python常用内置模块有哪些

小编给大家分享一下python常用内置模块有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用模块当import一个模块时,自动做三件事:1. 运行一遍该模块
2023-06-26

Python常见的模块有哪些

本篇内容主要讲解“Python常见的模块有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python常见的模块有哪些”吧!python可以做什么?如果把开发按照层次划分的话,可以分成系统开发
2023-06-02

Python编程最常见的模块

这篇文章主要讲解了“Python编程最常见的模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python编程最常见的模块”吧!你是否曾经被大量的python模块压垮过?你是否曾经在为一个特
2023-06-15

python 内置模块

一.random模块  随机        random()    随机小数            uninform(a,b) 随机小数randint(a,b)  随机整数choice() 随机选择一个sample() 随机选择多个 shu
2023-01-30

python re模块常见函数

re.match()函数如果想要从源字符串的起始位置匹配一个模式,我们可以使用re.match()函数。re.match()函数的使用格式是:re.match(pattern, string, flag)re.search()函数我们还可以
2023-01-31

python 之 os 模块的常见用法

在Python的标准库os模块中包含普遍的操作系统功能os 模块引入的方法是: import os以下为 os 模块常见的使用方法:    1、os.getcwd 获取当前的工作目录,即程序执行的目录    2、os.name 字符串指示正
2023-01-31

python 内置模块collectio

1、namedtuplefrom collections import namedtuplewebsites = [('Sohu', 'http://www.google.com/', u'张朝阳'),('Sina', 'http://ww
2023-01-31

python内置模块~shutil

--High-level file operations,高级的文件操作模块~shutil 模块的使用主要包括对文件及目录的移动、复制、打包、压缩(解压)、删除等操作。是对os模块的一个补充~shutil.copyfileobj(fsrc,
2023-01-31

python常见的内置函数

函数分为自定义函数和内置函数python内置函数分类:一、强制转换int() / str() / bool() / list() / tuple() / dict() / set()二、输入输出input() / print()三、数学相关
2023-01-31

pip 安装python模块常见错误

1.报错:c/_cffi_backend.c:15:17:fatal error: ffi.h: No such file or directory     #include                      ^   
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录