ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Python random&re&time模块&正则表达式 08】

2022-04-26 20:32:43  阅读:213  来源: 互联网

标签:匹配 Python 08 random ret re print path os


一、常用模块rendom

什么叫模块?  import time  time这样的就叫模块

模块都是C写的,所有的模块当中也是一对代码,这一对代码引入以后就可以直接使用

模块的分类

  • 内置模块
  • 扩展模块\第三方模块 (比如:django,pandas等)
  • 自定义模块

1、random模块 (随机函数)

随机的规则:在某一个范围中能够抽到每一个值的概率都是相同的

import random
ret=random.random() #0~1之间的随机数
print(ret)

# 100-200之间的随机整数
ret2 = random.randint(100,200)  #-->randint取随机整数,左右都是闭区间【】
print(ret2)

ret3 = random.randrange(100,200,50) #randrange(start,end,end)
print(ret3)

lst = [1,2,3,4,5,6,7]
random.shuffle(lst) #shuffle随机打乱列表内的元素,常用于扑克牌洗牌
print(lst)

ret4 = random.choices([1,2,'zx',[1,2,3]]) #随机取一个值
print(ret4)

ret5 = random.sample([1,2,'alex',[1,2,3]],20)  #随机取多个值
print(ret5)

2、正则表达式

正则表达式 : 只和字符串打交道
    # 第一: 从一大段文字中,获取符合条件的内容
        # 爬虫
    # 第二: 检测某一个字符串,是否完全符合规则
        # 表单的验证
            # 并不会真的请求银行,具体手机,具体的邮件
            # 总是根据一些规则来先判断是否合法

1)字符组

  • 匹配所有数字:[1-9]
  • 匹配所有小写字母:[a-z]
  • 匹配所有大写字母:[A-Z]
  • 匹配所有字母数字:[0-9a-zA-Z],
  •     |-这里的匹配规则只能从ascii码小的值到大的值,可以一次取多个区间:[0-9a-f]   a 的ascii是97  A是64

2)元字符

  •  \d   [0-9]  一样的意思
  •  \w   [0-9a-zA-Z_] 表示:数字字母下划线中文
  •  \s \t \n  匹配所有的空白符\制表符\换行符
  •  \D \W \S 匹配所有非数字\匹配所有非数字字母下划线\匹配所有非空白
  •  .    匹配除了换行符之外的任意一个字符
  •  ^ $  匹配一个字符串的开始,$匹配一个字符串的结束
  • [] [^] 字符组 非字符组
  •  | () 或  用来规范符号的作用域

3)量词

  •  {n}  表示匹配n次
  •  {n,} 表示匹配至少n次
  •  {n,m} 表示最少匹配n次,最多匹配m次
  •  ?    0或1次
  •  +    1-无穷大
  •  *    0-无穷大

#案例:匹配手机号码

1[3-9]\d{9}

#案例:匹配任意一个正整数

[1-9]\d*

#案例:匹配任意一个小数

\d+\.\d+    ===>\d+表示长度的数字  \.是把.转义使用的  

#案例:匹配整数或小数

\d*(\.\d+)?  ===>通过()进行了分组,然后通过?确定要么是整数,要么就是小数,保证10.这样的数字是匹配不上的

注意:

  •  只写元字符  一个元字符表示一位字符上的内容
  •  元字符量词 量词只约束前面的一个元字符\
  •  (元字符元字符)量词   量词只能加一个

所有的正则表达式在工具中如果匹配成功,直接放到r'' 就可以直接使用   --> 意思是防止转义

3、re模块

1)findall、search、match方法

import re
# findall匹配所有匹配项目
ret = re.findall('\d+','hello123,world456')
print(ret) #['123', '456']
# search从头开始往后找,任何地方有符合条件的都返回一个,并且分组后只返回第一个
ret1 = re.search('\d+','hello123,world456')
print(ret1)
print(ret1.group()) #123
# match从头开始匹配,如果开始部分匹配到了匹配成功,如果开始部分没有匹配到就是匹配失败
ret1 = re.match('\d+','123hello123,456world456')
print(ret1)
print(ret1.group()) #123
# findall中的分组优先
ret3 = re.findall('\d+(\.\d+)?','hello123.222,world456.555')
print(ret3)#['.222', '.555']
'''
执行的结果为什么会出现这种情况,其实findall会把123.222和456.555都取出来,
但是由于分组优先的规则所以把.后面的内容取出来了,
那么如何解决?
'''
ret4 = re.findall('\d+(?:\.\d+)?','hello123.222,world456.555')
print(ret4) #['123.222', '456.555']
'''只需要在\.前面加上?:即可解决'''

#案例:手机号码的验证

import re
phone = input('请输入手机号码:')
regex = r'^1[2-9]\d{9}$'
ret = re.search(regex,phone)
if ret:
    print('手机号是合法的 %s'%phone)
else:
    print('手机号是不合法的!')

如果用match,regex=r'1[2-9]\d{9}$' regex中就不需要^

#了解内容:根据正则进行切割

ret = re.split(r'\d+',r'alex84wusir78')
print(ret)

2)sub 替换方法

# sub替换方法 语法:sub(正则表达式,要替换的内容,待替换的字符串,替换的个数)
ret = re.sub(r'\d','W','alex789wusir234',1)
print(ret) #alexW89wusir234

3)subn 替换方法

# subn替换方法2 返回值是一个元组,第一项是结果,第二项是替换次数
ret = re.subn(r'\d+','W','alex789wusir234',2)
print(ret) #('alexWwusirW', 2)

4、os模块

  • os.path.getsize(绝对路径)  获取文件的大小,但是不能获取文件夹的准确大小
  • os.path.isfile(绝对路径)  判断是否是文件
  • os.path.isdir(绝对路径) 判断是否是文件夹
  • os.path.join(文件夹的名字,名字) 跨平台的文件路径的拼接
  • os.listdir('文件夹的名字') 显示这个文件夹下的所有名字(包括文件和文件夹)

#案例:计算文件夹的大小

import os

def path_size(path):
    # 判断是不是文件夹
    if os.path.isdir(path):
        sum_size = 0
        # 获取path路径下文件的名称,最终生成的是一个列表
        dir_name = os.listdir(path)
        # 遍历列表
        for name in dir_name:
            # 把列表和路径拼接在一起
            file_path = os.path.join(path,name)
            # 如果是一个文件,则计算所有文件的大小并相加求和,否则(文件夹)利用递归再次进行剥离计算此文件夹路径下的文件大小
            print(file_path)
            if os.path.isfile(file_path):
                sum_size +=os.path.getsize(file_path)
            else:
                path_size(file_path)
        return sum_size
    #判断是文件,然后计算文件大小
    elif os.path.isfile(path):
        # print('这是一个文件')
        return os.path.getsize(path)
    else:
        print('这不是一个文件或文件夹')

path1 = r'/Users/wufq/Documents/pythonSenio/day03'
path2 = r'/Users/wufq/Documents/pythonSenio/day03/eval和exec函数.py'
path3 = r'/Users/wufq/Documents/pythonSenio/day03/dir1/dir_son1'

ret1 = path_size(path3)
print(ret1)

 os

os.path

#举例:

path = r'/Users/wufq/Documents/pythonSenio/day03/eval和exec函数.py'
ret = os.path.split(path)
ret1 = os.path.split(r'/Users/wufq/Documents/pythonSenio/day03')
print('split1------>',ret)
print('split2------>',ret1)

ret = os.path.dirname(path)
print('dirname------>',ret)
ret = os.path.basename(path)
print('basename------->',ret)

执行结果:

split1------> ('/Users/wufq/Documents/pythonSenio/day03', 'eval和exec函数.py')
split2------> ('/Users/wufq/Documents/pythonSenio', 'day03')
dirname------> /Users/wufq/Documents/pythonSenio/day03
basename-------> eval和exec函数.py

注意:os.path.split  切割路径形成元组,但是永远切割的是最后一个内容,比如路径最后一个是eval和exec函数.py,那么切割是就会切成结果1这样子,如果路径最后一个是day03,那么切割时就会切成结果2的样子,反正就会把最后一个元素切出来,分成两半,dirname取split切割后路径的第一个元素,basename取split切割后路径的第二个元素

 5、time模块

标签:匹配,Python,08,random,ret,re,print,path,os
来源: https://www.cnblogs.com/frankruby/p/16196327.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有