目录

time 时间模块

Python的内置方法

数字模块

随机模块

序列化模块 pickle

序列化模块 json

os 系统模块

os  shutil 模块

os,path 模块

文件压缩模块 zipfile

文件压缩模块 tarfile

计算文件大小 代码

正则表达式

time时间模块

time : 时间戳

mktime : 时间元祖转时间戳

ctime: 时间戳转时间字符串

strftime: 时间元祖转时间字符串

strptime: 时间字符串转时间元组

# ### time 时间模块
import time # localtime -> mktime -> ctime
# 时间元组 -> 时间戳 -> 时间字符串
# time() 获取本地时间戳 (*)
res = time.time()
print(res) # localtime() 获取本地时间元组(参数是时间戳,默认当前) (*)
res = time.localtime()
print(res)
"""
time.struct_time(
tm_year=2020,
tm_mon=7,
tm_mday=28,
tm_hour=10,
tm_min=45,
tm_sec=9,
tm_wday=1,
tm_yday=210,
tm_isdst=0
)
"""
# 指定时间戳,返回时间元组
ttp = 1595904161
res = time.localtime(ttp)
print(res) # mktime() 通过时间元组获取时间戳(参数是时间元组) (*)
ttp = (2020,7,28,10,48,30,0,0,0)
res = time.mktime(ttp)
print(res) # 1595904510 # ctime() 获取本地时间字符串(参数是时间戳,默认当前) (*)
res = time.ctime() # 默认以当前时间戳获取时间字符串
print(res)
# 指定时间戳
res = time.ctime(1595904161)
print(res) # asctime() 通过时间元组获取时间字符串(参数是时间元组)(了解)
ttp = (2020,7,28,10,54,30,6,0,0) # 不能自动识别周几.
res = time.asctime(ttp)
print(res)
# 改造办法
ttp = (2020,7,28,10,54,30,0,0,0)
res = time.mktime(ttp)
str_time = time.ctime(res)
print(str_time) # sleep() 程序睡眠等待 (*)
"""
time.sleep(2)
print("我睡醒了")
""" """
strftime => 把时间元组 -> 时间字符串
strptime => 把时间字符串 -> 时间元组
"""
# strftime() 格式化时间字符串(格式化字符串,时间元祖) (*)
# 1.默认按照当前时间做格式化
res = time.strftime("%Y-%m-%d %H:%M:%S")
print(res)
# 2.指定时间元组,对时间字符串格式化
"""strftime如果在windows当中出现中文,直接报错,不能解析,linux 可以支持"""
ttp = (2000,10,1,12,12,12,0,0,0)
res = time.strftime("%Y-%m-%d %H:%M:%S" , ttp)
print(res) # strptime() 将时间字符串通过指定格式提取到时间元组中(时间字符串,格式化字符串) (*)
"""要求字符串不能乱加符号,必须严丝合缝."""
strvar = "2020年7月28号11时12分13秒是著名歌星庾澄庆的生日"
ttp = time.strptime(strvar,"%Y年%m月%d号%H时%M分%S秒是著名歌星庾澄庆的生日")
print(ttp) # perf_counter() 用于计算程序运行的时间 (了解)
# 记录开始时间
# startime = time.perf_counter()
startime = time.time()
for i in range(100000000):
pass
# 记录结束时间
# endtime = time.perf_counter()
endtime = time.time()
print(endtime - startime)

利用time模块实现动态进度条效果

进度条准备工作

import time

# (1) 定义进度条的样式
'''%-50s让#号居左显示且占50个空位'''
print("[%-50s]" % ("#"))
print("[%-50s]" % ("###############"))
print("[%-50s]" % ("#########################")) # (2) 让进度条动起来 strvar = ""
for i in range(50):
strvar += "#"
time.sleep(0.1)
print("\r[%-50s]" % (strvar) , end="" ) # \r的作用:将后面的字符直接拉到当前行行首

实现进度条的进度效果

# (3) 根据文件的大小,调整进度条的位置
# 假设文件的大小是 1024000
def progress(percent):
# 如果百分比超过了1,说明数据已经接受完毕;
if percent > 1:
percent = 1 # 打印对应的#号效果
strvar = "#" * int(percent * 50)
# %% => %
print("\r[%-50s] %d%%" % (strvar,int(percent * 100)) , end="" ) # 初始化接受的字节数
recv_size = 0
# 文件接受总大小
total_size = 1024000
while recv_size < total_size:
recv_size += 1024
# 模拟延迟
time.sleep(0.01)
# 计算百分比
percent = recv_size/total_size #0.001
# 调用进度条函数
progress(percent)

Python的内置方法

res = abs(-100)
pritn(res)
# 输出结果 为 100

1. abs 绝对值

lst= [1,2,3]
res =sum (lst)
print(res)
# 输出结果为 6

2. sum 计算一个序列的和

lst = [1,3,2,5,6]
res = max(lst)
print(res)
# 输出结果为6

3. max 获取序列中最大的值

lst = [1,3,2,5,6]
res = min(lst)
print(res)
# 输出结果为1

4. min 获取序列中最小的值

res = pow (2,3)    # 2 为值   3 为次方
print (res)
# 输出结果 为 8

5. pow 计算某值的次方

# bin   将10 进制 转为 2 进制
# oct 将 10 进制 转为 8 进制
# hex 将 10 进制 转为 16 进制 res1 = bin(9)
res2 = oct(9)
res3 = hex(9)
print(res1,res2,res3)
# 输出结果为 0b1001 0o11 0x9

进制转换

#chr ascll 转 字符
#ord 字符转 ascll res= ord('a')
res1 =chr(33)
print( res,res1)

ascll 和 字符 转换

""“注意点:在与用户交互的时候,慎用”""

a=90
exec('print(a)')

exec 将字符串当做 Python代码执行(功能强大)

repr 不转义字符输出字符串

input 接收输入字符串(永远接收字符串)

“”“相同的两个数据经过哈希算法运算得出的结果一定相同”""
res1 = hash(“abc”)
res2 = hash(“abc”)
print(res1,res2)\
# 输出结果为 4521462165539241311 2948100441812388161

hash 生成哈希值

# 正常情况下遵循四色五入, 但是在 n.5 结构中, n为偶数则会舍去,n 为奇数则进一

res1 = round(4.51)  # s
res2 = round((4.5) #4
res3 = round(3.5) # 4
res4 = round(4.12) #4

round 四舍五入

数字模块

# ### 数学模块
import math #ceil() 向上取整操作 (对比内置round)*
res = math.ceil(4.9) # 5
res = math.ceil(-3.5) # -3
print(res) # floor() 向下取整操作 (对比内置round)*
res = math.floor(3.9) # 3
res = math.floor(-3.8) # -4
print(res) # pow() 计算一个数值的N次方(结果为浮点数) (对比内置pow)
res = math.pow(2,3) # 8
# res = math.pow(2,3,3) error # 只有2个参数
print(res) # 结果一定是小数:8.0 # sqrt() 开平方运算(结果浮点数)*
res = math.sqrt(9)
print(res) # 结果一定是小数:3.0 # fabs() 计算一个数值的绝对值 (结果浮点数) (对比内置abs)
res = math.fabs(-99)
print(res) # 99.0 # modf() 将一个数值拆分为整数和小数两部分组成元组*
res = math.modf(13.45)
print(res) # (0.4499999999999993, 13.0) # copysign() 将参数第二个数值的正负号拷贝给第一个 (返回一个小数)*
res = math.copysign(-13,-1)
print(res) # 返回一个小数 # fsum() 将一个容器数据中的数据进行求和运算 (结果浮点数)(对比内置sum)
lst = [1,2,3,4,6]
res = math.fsum(lst)
print(res) # 返回一个小数 #圆周率常数 pi*
res = math.pi
print(res)

随机模块

# ### random 随机模块
import random # random() 获取随机0-1之间的小数(左闭右开) 0<= x <1
res = random.random()
print(res) # randrange() 随机获取指定范围内的整数(包含开始值,不包含结束值,间隔值) **
# 一个参数
res = random.randrange(5) # 0~4
# 二个参数
res = random.randrange(2,8) # 2~7
# 三个参数
res = random.randrange(1,10,3) # 1,4,7
print(res) # randint() 随机产生指定范围内的随机整数 (了解)
res = random.randint(3,4) # 3,4
# res = random.randint(3) error
# res = random.randint(3,7,2) error # 3 5 7
print(res) # uniform() 获取指定范围内的随机小数(左闭右开)
res = random.uniform(1,3) # 1<=x<3 小数 # return a + (b-a) * self.random()
"""
a=3,b=1
3 + (1-3) * x = 0 => 3
3 + (1-3) * x = 1 => 1
1<x<=3
"""
res = random.uniform(3,1)
print(res) #choice() 随机获取序列中的值(多选一)
lst = ["刘鑫","刘子豪","孙致和","高旭峰","戈隆"]
res = random.choice(lst)
print(res) def mychoice(lst):
num = random.randrange(len(lst)) # 0 1 2 3 4
return lst[num]
res = mychoice(lst)
print(res) # lambda 表达式
func = lambda lst : lst[random.randrange(len(lst))]
print(func(lst)) #sample() 随机获取序列中的值(多选多) [返回列表]
lst = ["刘鑫","刘子豪","孙致和","高旭峰","戈隆"]
res = random.sample(lst,1)
res = random.sample(lst,2)
print(res) #shuffle() 随机打乱序列中的值(直接打乱原序列)
lst = ["刘鑫","刘子豪","孙致和","高旭峰","戈隆"]
random.shuffle(lst)
print(lst)

利用random模块实现验证码的生成

def yanzhengma():
# 验证码当中含有小写字母,大写字母,数字
# 小写字母:97~122
strvar = ""
# 随机抽4次
for i in range(4):
s_char = chr(random.randrange(97,123))
# 大写字母:65~90
b_char = chr(random.randrange(65,91))
# # 0~9
num = str(random.randrange(10))
lst = [s_char,b_char,num]
strvar += random.choice(lst)
return strvar
res = yanzhengma()
print(res)

序列化模块 pickle

1. 序列化: 把不能直接存储的数据变得可以存储,这个过程叫做序列化

2. 反序列化: 把文件中的数据取出来,恢复到原来的数据类型,这个过程叫做反序列化

3. 在文件中存储的数据只能是字符串或者字节流,不可以是其他类型,如果想要存储其他类型的数据必须序列化.

4. pickle模块可以序列化一切数据类型

5. 只有字符串可以encode和decode转化为字节流

  dumps 序列化

  loads  反序列化

6. 序列化输入文件

lst = {'马生平","曹成光","吴洪昌"]
with open("文件",modo="wb") as tf
pickle.dump(lst,tf)

7. 反序列化输出文件

with open("文件",mode"rb") as tf:
res=pickle.load(tf)
print(res)

dumps 和 loads 文件操作的区别

lst =['马生平","曹成光",'吴洪昌"]
res =pick.dumps(lst)
with open("文件",mode='wb') as tf:
tf.write(res)
with open("文件",mode='rb') as tf:
res=fp,read()
print(res)
lst =pickle.loads(res)
print(lst.tpe(lst))

序列化模块 json

1. 所有的编程语言都识别的序列化格式json ,是字符串

2. jsom可以序列化的类型有( int float str list tuple dict None)

3 用法一:

dic ={'name':'高学峰','age':18}
res= json.dumps(dic,ensure_ascii=False,sort_keys=
True)
print(res,type(dic)) dic={'name':'高学峰','age':18)
print(dic,type(dic))

4. 用法二:

dic ={'name':'高学峰','age':18}
with open("文件",mode="w",encodig="utf-8') as fp:
json.dump(dic,fp,ensue_ascii=False)
with open("文件",mode='r',encoding="utf-8") as fp:
dic=json.load(fp)
print(dic,type(dic))

5. json 与 pickle 之间的区别

6. json 可以连续dump,但是不能连续load
dic1={'a':1,'b':2}
dic2={'c':3,'d':4}
with open('文件',mode='w',encoding='uf-8') as fp:
json.dump(dic1,fp)
fp.write('\n')
json.dump(dic2,fp)
fp.write('\n')
7. load 在获取数据时,一次性拿出所有内容
解决方法
with open('文件',mode='r',encoding='utf-8') as fp:
for i in fp:
dic =json.loads()
print(dic,type(dic)) pickle 可以连续dump也可以连续load,因为pickle在存储的时候会在末尾加上一个结束符
import pickle
dic1={'a':1,'b';2}
dic2={'c':3,'d':4}
with open ('文件',mode='wb') as fp:
pickle.dump(dic1,fp)
pickle.dump(dic2,fp)
with open ('文件',mode= 'rb') as fp:
dic1=pickle.load(fp)
print(dic1,type(diuc1))
dic2=pickle.load(fp)
print(dic2,type(dic2)) try:
可能报错的代码
except:
如果报错执行except这个代码块: try:
with open ('文件',mode+'rb') as fp:
while True:
res=pickle.load(fp)
print(res)
except:
pass

  json 序列化之后的数据类型是str,所有编程语言都识别,但是仅限于( int float bool list tuple dict None)

  json 不可以连续load ,只能一次性拿出所有数据

  pickle 序列化之后的数据类型是bytes,所有数据类型都可以转换,但是仅限于python 之间的数据存储和传输

  pickle 可以连续load ,多套数据放在同一个文件中

json 的使用广泛性比pickle 广

json 用在不同的编程语言的数据交流中

pickle 用于数据的存储

os 系统模块

方法: system   popen  listdir  getcwd  chdir  environ  /  name sep  linesep

import os

#### os模块方法 ####

# 1.system 在python中执行系统命令
os.system("ifconfig")
os.system("touch 1.txt") # 2.popen 执行系统命令返回对象
# 可以通过read方法读出字符串,防止字符串乱码,使用popen进行操作
obj = os.popen("ifconfig")
res = obj.read()
print(res) # 3.listdir 获取指定文件夹中的所有内容的名称列表
lst = os.listdir(".") # . 当前目录
lst = os.listdir("..") # . 上一级目录
lst = os.listdir("/home/libolun")
print(lst) # 4.getcwd 获取当前文件所在的默认路径(单纯的路径)
res = os.getcwd()
print(res) # /mnt/hgfs/python31_gx/day19
# 路径+文件
print(__file__) # /mnt/hgfs/python31_gx/day19/1.py # 5.chdir 修改当前文件工作的默认路径
os.chdir("/home/libolun/mywork")
os.system("mkdir ceshi100") # 6.environ 获取或修改环境变量
print(os.environ) # 获取所有环境变量
print(os.environ["path"])
os.environ["path"] += ":/home/libolun/mywork" # 修改环境变量
os.system("libolun") #### os模块属性 #### # 1.name 获取系统标识
# linux,mac->posix windows->nt
print(os.name) # 2.sep 获取路径分割符号
# linux,mac-> / windows-> \
print(os.sep) # 3.linesep 获取系统的换行符号
# linux,max-> \n windows->\r\n或\n
print(repr(os.linesep))

os模块: 新建和删除

mknod  remove  mkdir  rmdir  rename  makedirs  removedirs

#### os 负责新建和删除 ####

# 1 os.mknod 创建文件
os.mknod("1.txt") # 2.os.remove 删除文件
os.remove("1.txt") # 3.os.mkdir 创建文件夹
os.mkdir("ceshi100") # 4.os.rmdir 删除文件夹
os.rmdir("ceshi100") # 5.os.rename 对文件/文件夹重命名
os.rename("111.txt","123.py") # 6.os.makedirs 递归创建文件夹
os.makedirs("a/b/c/d/e") # 7.os.removedirs 递归删除文件夹(空文件夹)
os.removedirs("a/b/c/d/e")

os  shutil 模块

copyfilleobj   copyfile  copymode  copystat  copy  copy2   copytree  rmtree  remove

# 1.copyfileobj(fsrc,fdst,[,length=16*1024]) 单纯复制文件的内容
# 需要手动创建文件对象
fp1 = open("123.py",mode='r',encoding="utf-8")
fp2 = open("lianxi111.php",mode="w",encoding="utf-8")
shutil.copyfileobj(fp1,fp2) # 2.copyfile(src,dst) 单纯的仅复制文件内容
# 在底层调用了copyfileobj
shutil.copyfile("1.php","2.js") # 3.copymode(src,dst) 单纯的复制权限,不包括文件内容
shutil.copymode("1.php","2.js") # 4.copystat(src,dst) 复制文件所有状态信息,不包括内容
# 状态信息:包括权限、组、用户、修改时间
shutil.copystat("1.py","2.php") # 5.copy(src,dst) 复制文件的权限和内容
shutil.copy("1.py","2.html") # 6.copy2(src,dst) 复制文件权限和内容,还有组,时间,用户等
shutil.copy2("1.py","2.html") # 7.copytree(src,dst) 复制文件夹里的所有内容(递归拷贝)
shutil.copytree("lianxi001","lianxi002") # 8.rmtree(path) 删除当前文件夹以及文件夹中的所有内容(递归删除)
shutil.rmtree("lianxi001") # 9.move(path1,path2) 移动文件或者文件夹
shutil.move("1.php","..")
shutil.move("lianxi001","../lianxi007") # 移动并改名

os.path 路径模块

basename  dirname  split  join  splitext  getsize  isdir  isfile  islink  getctime  getatime  getmtime  exists  isabs  abspath

# 1.basename 返回文件名部分
strvar = "/home/libolun/mywork/1.py"
res = os.path.basename(strvar)
print(res) # 1.py # 2.dirname 返回路径部分
res = os.path.dirname(strvar)
print(res) # /home/libolun/mywork # 3.split 将路径拆分为单独的文件部分和路径部分,并组合成一个元组
tup = os.path.split(strvar)
print(tup) # 4.join 将多个路径和文件组成新的路径
# 可以自动通过不同的系统加不同的斜杠
path1 = "ceshi1"
path2 = "libolun"
path3 = "2.py"
# pathvar = path1 + os.sep + path2 + os.sep + path3
pathvar = os.path.join(path1,path2,path3)
print(pathvar) # 5.splitext 将路径分割为后缀和其他部分
res = os.path.splitext(strvar)
print(res) # ('/home/libolun/mywork/1','.py') # 6.getsize 获取文件的大小
res = os.path.getsize("1.py")
# 文件夹不能计算
res = os.path.getsize("os")
print(res) # 7.isdir 检测路径是否是一个文件夹
strvar = "/home/libolun/mywork/libolun"
res = os.path.isdir(strvar)
print(res) # 8.isfile 检测路径是否是一个文件
strvar = "/home/libolun/mywork/libolun"
res = os.path.isfile(strvar)
print(res) # 9.islink 检测路径是否是一个链接
strvar = "/home/libolun/mywork/libolun"
res = os.path.islink(strvar)
print(res) # 10.getctime [windows]文件的创建时间 [linux]权限的改动时间
# 返回的是时间戳
res = os.path.getctime("1.py") # 11.getmtime 获取文件最后一次修改时间
res = os.path.getmtime("1.py") # 12.getatime 获取文件最后一次访问时间
res = os.path.getatime("1.py") # 13.exists 检测指定的路径是否存在
strvar = "/home/libolun/mywork/libolun"
res = os.path.exists(strvar)
print(res) # 14.isabs 检测一个路径是否是绝对路径
pathvar = "."
res = os.path.isabs(pathvar)
print(res) # 15.abspath 将相对路径转化为绝对路径
pathnew = os.path.abspath(pathvar)
print(pathnew) # 检测是否是绝对路径,如果不是,将其转化为绝对路径
if not os.path.abspath(pathvar):
pathnew = os.path.abspath(pathvar)
print(pathnew)

文件压缩模块 zipfile

文件压缩

#(1)创建压缩包
zf = zipfile.ZipFile('wenjian","w',zipfile.ZIP_DELATED)
#(2)把文件写入到压缩包中
#write(路径,别名)
zf.write('/bin/home','home')
#可以临时创建一个文件夹天麻片在压缩包中
zf.write("/bin/df","/tmp/df")
# (3) 关闭压缩包
zf.close()

文件解压

# (1)打开压缩包
zf = zipfile.ZipFile("1424.zip","r")
# (2)解压文件
# 解压单个文件
zf.extract("cp","ceshi1424_2")
# 解压所有文件
# zf.extractall("ceshi1424")
# (3) 关闭压缩包
zf.close()

文件追加

with zipfile.ZipFile("1424.zip","a",zipfile.ZIP_DEFLATED) as zf:
zf.write("/bin/dir","dir")

查看压缩包

with zipfile.ZipFile("1424.zip","r",zipfile.ZIP_DEFLATED) as zf:
lst = zf.namelist()
print(lst)

文件压缩模块 tarfile

mode1. tar

mode2. .tar.gz

mode3 .tar.bz2  压缩到最小

1. 创建atr包

# 单纯的tar包
tf = tarfile.open("ceshi0729_1.tar","w",encoding="utf-8")
tf.add("/bin/echo","echo")
tf.add("/bin/ed","ed")
tf.add("/bin/fuser","/tmp/fuser")
tf.close() # .tar.gz
tf = tarfile.open("ceshi0729_2.tar.gz","w:gz",encoding="utf-8")
tf.add("/bin/echo","echo")
tf.add("/bin/ed","ed")
tf.add("/bin/fuser","/tmp/fuser")
tf.close() # .tar.bz2
tf = tarfile.open("ceshi0729_3.tar.bz2","w:bz2",encoding="utf-8")
tf.add("/bin/echo","echo")
tf.add("/bin/ed","ed")
tf.add("/bin/fuser","/tmp/fuser")
tf.close()

2. 对压缩包进行解压

tf = tarfile.open("ceshi0729_3.tar.bz2","r",encoding="utf-8")
# 解压单个
tf.extract("echo","ceshi0729_4")
# 解压所有
# tf.extractall("ceshi0729_3")
tf.close()

3. 追加文件

#(支持with语法) [只能为没有压缩过的tar包进行追加.]
with tarfile.open("cceshi0729_1.tar","a",encoding="utf-8") as tf:
tf.add("/bin/cp","cp")

4. 查看包中的文件

with tarfile.open("ceshi0729_2.tar.gz","r",encoding="utf-8") as tf:
lst = tf.getnames()
print(lst)

计算文件大小 代码

import os

pathvar = "/mnt/hgfs/python31_gx/day19/ceshi100"
# 基本写法
lst = os.listdir(pathvar)
print(lst) # ['1.py', '2.py', '3.py', 'ceshi200']
size = 0
for i in lst:
# 拼接路径
pathnew = os.path.join(pathvar,i)
# 判断是否是文件
if os.path.isfile(pathnew):
print(i,"[文件]")
size += os.path.getsize(pathnew)
# 判断是否是文件夹
elif os.path.isdir(pathnew):
print(i,"[文件夹]") print(size)
"""不确定有多少层级的情况下,使用递归""" # 递归计算文件夹的大小
def getallsize(pathvar):
size = 0
# 获取当前文件夹中所有内容
lst = os.listdir(pathvar)
# 循环列表
for i in lst:
# 拼接完整路径
pathnew = os.path.join(pathvar,i)
# 判断是否是文件或者文件夹
if os.path.isfile(pathnew):
size += os.path.getsize(pathnew)
elif os.path.isdir(pathnew):
# 如果是文件夹,继续调用函数.
size += getallsize(pathnew)
# 返回最后的结果
return size
res = getallsize(pathvar)
print(res)

正则表达式

单字符匹配

1. 预定义字符

  \d  匹配数字  \D  匹配非数字

  \w 匹配数字字母下划线  \W 匹配非数字字母下划线

  \s 匹配任意空白符( \n  \t  \r  空格)  \S匹配任意空白符

  \n 匹配一个换行符

  \t 匹配一个制表符

# ### 预定义字符集
# \d 匹配数字
strvar = "sdfsdf*(&*(&(2ui3"
lst = re.findall("\d",strvar)
print(lst) # \D 匹配非数字
strvar = "sdfsdf*(&*(&(2ui3"
lst = re.findall("\D",strvar)
print(lst) # \w 匹配字母数字下划线
strvar = "sadf*)(*_)456你你好"
lst = re.findall("\w",strvar)
print(lst) # \W 匹配非字母或数字或下划线
strvar = "sadf*)(*_)456你你好"
lst = re.findall("\W",strvar)
print(lst) # \s 匹配任意的空白符 (\n \t \r ' ')
strvar = " "
lst = re.findall("\s",strvar)
print(lst) # \S 匹配任意非空白符
strvar = " abdd "
lst = re.findall("\S",strvar)
print(lst) # \n 匹配一个换行符
strvar = """ """
lst = re.findall(r"\n",strvar)
print(lst) # \t 匹配一个制表符
strvar = """ """
lst = re.findall(r"\t",strvar)
print(lst)

2,. 字符组[] 必须从字符组列出来的字符当中抽取, 默认一个,如果没有返回空

strvar = "abpoiuc"
lst = re.findall("[abc]",strvar)
print(lst) # ['a', 'b', 'c']
print(re.findall('a[abc]b','aab abb acb adb')) # aab abb acb
print(re.findall('a[0123456789]b','a1b a2b a3b acb ayb')) # a1b a2b a3b
# - 代表到,代表的是范围
# 0-9 0到9这么多的数字
print(re.findall('a[0-9]b','a1b a2b a3b acb ayb')) # a1b a2b a3b
# a-g => abcdefg
print(re.findall('a[abcdefg]b','a1b a2b a3b acb ayb adb')) # acb adb
print(re.findall('a[a-g]b','a1b a2b a3b acb ayb adb')) # acb adb
# a-z => 26个小写字母
print(re.findall('a[a-z]b','a1b a2b a3b acb ayb adb')) # acb ayb adb
# A-G => ABCDEFG
print(re.findall('a[ABCDEFG]b','a1b a2b a3b aAb aDb aYb')) #aAb aDb
print(re.findall('a[A-G]b','a1b a2b a3b aAb aDb aYb')) #aAb aDb
# A-Z=> 26个大写字母
print(re.findall('a[A-Z]b','a1b a2b a3b aAb aDb aYb')) #aAb aDb aYb
print(re.findall('a[0-9a-zA-Z]b','a-b aab aAb aWb aqba1b')) # aab aAb aWb aqb a1b
# 0-z 不会单纯的匹配小写大写字母和数字,还会匹配到特殊的符号,比如_和@
print(re.findall('a[0-z]b','a_ba@b aab aAb aWb aqba1b')) # aab aAb aWb aqb a1b
print(re.findall('a[0-9][*#/]b','a1/b a2b a29b a56b a456b')) #a1/b
# ^ 除了 , 在字符组当中,开头的位置使用
print(re.findall('a[^-+*/]b',"a%b ccaa*bda&bd")) #a%b a&b

3.匹配^ -

#如果想要匹配^ -  需要在前面加上\进行转义
lst = re.findall(“a[^-]b”,“a+b a-b a^b”)
print(lst) # [‘a-b’, ‘a^b’]

4. 匹配 /

#\b本身也是转义字符: 退格( 把光标向左移动一位) 
lst = re.findall(r"a\b",r"a\b")
print(lst[0])

多字符匹配

量词

?  0-1

+  1-n

*  0-n

{m,n}  m-n

# 量词
'''1) ? 匹配0个或者1个a '''
print(re.findall('a?b','abbzab abb aab')) # ab b ab ab b ab
'''2) + 匹配1个或者多个a '''
print(re.findall('a+b','b ab aaaaaab abb')) # ab aaaaaab ab
'''3) * 匹配0个或者多个a '''
print(re.findall('a*b','b ab aaaaaab abbbbbbb')) # b ab aaaaaab ab b b b b b b
'''4) {m,n} 匹配m个至n个a '''
# 1 <= x <= 3
print(re.findall('a{1,3}b','aaab ab aab abbb aaz aabb')) # aaab ab aab ab aab
# {2,} 至少2次
print(re.findall('a{2,}b','aaab ab aab abbb aaz aabb')) # aaab aab aab
# {2,} 必须2次
print(re.findall('a{2}b','aaab ab aab abbb aaz aabb')) # aab aab aab

贪婪匹配与非贪婪匹配

1. 贪婪匹配: 默认向更多次匹配(回溯算法)  非贪婪匹配: 默认向更少次匹配

2. 非贪婪匹配: 在量词后面接?   .??   .+?  .*?  {4,}?

3. 回溯算法: 从左向右进行匹配,直到匹配到最后,再也找不到了,回头,找最后一个(递归)

4.    . 匹配任意字符,(除了换行符\n)

# 练习题
strvar = "刘能和刘老根和刘铁柱子111子222" lst = re.findall("刘.",strvar) # ['刘能', '刘老', '刘铁']
print(lst) lst = re.findall("刘.?",strvar) # ['刘能', '刘老', '刘铁']
print(lst) lst = re.findall("刘.+",strvar) # ['刘能和刘老根和刘铁柱子111子222']
print(lst) lst = re.findall("刘.*",strvar) # ['刘能和刘老根和刘铁柱子111子222']
print(lst) lst = re.findall("刘.{4,}子",strvar) # ['刘能和刘老根和刘铁柱子111子']
print(lst) # 非贪婪匹配
lst = re.findall("刘.??",strvar) # ['刘', '刘', '刘']
print(lst) lst = re.findall("刘.+?",strvar) # ['刘能', '刘老', '刘铁']
print(lst) lst = re.findall("刘.*?",strvar) # ['刘', '刘', '刘']
print(lst) lst = re.findall("刘.{4,}?子",strvar) # ['刘能和刘老根和刘铁柱子']
print(lst)

边界符

\b  本身也是转义字符: 退格( 把光标向左移动一位)

word

右边界:  d\b

左边界:  \bw

# 右边界
strvar = "word pwd scf"
lst = re.findall(r"d\b",strvar)
print(lst) # ['d', 'd'] lst = re.findall(r".*d\b",strvar)
print(lst) # ['word pwd'] lst = re.findall(r".*?d\b",strvar)
print(lst) # ['word', ' pwd'] # 左边界
lst = re.findall(r"\bw",strvar)
print(lst) # ['w'] lst = re.findall(r"\bw.*",strvar)
print(lst) # ['word pwd scf'] lst = re.findall(r"\bw.*?",strvar)
print(lst) # ['w'] lst = re.findall(r"\bw.* ",strvar)
print(lst) # ['word pwd '] lst = re.findall(r"\bw.*? ",strvar)
print(lst) # ['word '] # \S 匹配的是非空白符
lst = re.findall(r"\bw\S*",strvar)
print(lst) # ['word']

^ $   开头/结尾

^匹配字符串的开头(必须以..开头)

$匹配字符串的结尾(必须以.结尾)

当使用^ 和$ 符号匹配的时候  要把字符串看成整体

strvar = "大哥大嫂大爷"
print(re.findall('大.',strvar)) # ['大哥', '大嫂', '大爷']
print(re.findall('^大.',strvar)) # ['大哥']
print(re.findall('大.$',strvar)) # ['大爷']
print(re.findall('^大.$',strvar)) # []
print(re.findall('^大.*?$',strvar)) # ['大哥大嫂大爷']
print(re.findall('^大.*?大$',strvar)) # []
print(re.findall('^大.*?爷$',strvar)) # ['大哥大嫂大爷'] print(re.findall('^g.*? ' , 'giveme 1gfive gay')) # ['giveme ']
print(re.findall('five$' , 'aassfive')) # ['five']
print(re.findall('^giveme$' , 'giveme')) # ['giveme']
print(re.findall('^giveme$' , 'giveme giveme')) # []
print(re.findall('giveme' , 'giveme giveme')) # ['giveme', 'giveme']
print(re.findall("^g.*e",'giveme 1gfive gay')) # ['giveme 1gfive']

匹配分组

# 分组练习(用圆括号)
print(re.findall('.*?_good','wusir_good alex_good secret男_good')) # ['wusir_good', ' alex_good', ' secret男_good']
# () 优先显示括号里面的内容
print(re.findall('(.*?)_good','wusir_good alex_good secret男_good')) # ['wusir', ' alex', ' secret男']
# ?: 取消显示括号里面的内容
print(re.findall('(?:.*?)_good','wusir_good alex_good secret男_good')) # ['wusir_good', ' alex_good', ' secret男_good'] # | 代表或 , a|b 匹配字符a 或者 匹配字符b . 把字符串长的写在前面,字符串短的写在后面
strvar = "abcdefg"
lst = re.findall("a|b",strvar)
print(lst) # ['a', 'b'] """在使用|的时候,把不容易匹配到的字符串放到前面,把容易匹配到的放到后面"""
strvar = "abciuiuabcdwerewr"
lst1 = re.findall("abc|abcd",strvar) # ['abc', 'abc']
lst2 = re.findall("abcd|abc",strvar) # 把不容易匹配的放到前面 ['abc', 'abcd']
print(lst1)
print(lst2)

匹配分组练习

. 除了\n 匹配所有字符

\. 代表的, 这个字符本身,不转义

小数和整数

strvar = ".34 .... 78.   78.12 56.3 .3 .4 .5 "
# 匹配小数
lst = re.findall(r"\d+\.\d+",strvar)
print(lst) # 匹配小数和整数
lst = re.findall(r"\d+\.\d+|\d+",strvar)
print(lst) # 分组来表达小数和整数
lst = re.findall(r"\d+(\.\d+)?",strvar)
print(lst) lst = re.findall(r"\d+(?:\.\d+)?",strvar)
print(lst) # ['34', '78', '78.12', '56.3', '3', '4', '5']

匹配手机号135或者171

# 匹配135或171的手机号
strvar = "13566668888 17166668888"
lst = re.findall(r"(?:135|171)\d{8}",strvar)
print(lst) # ['13566668888', '17166668888'] # 用^$卡死长度,只能是一个手机号,不能是多个
strvar = "13566668888"
lst = re.findall(r"^(?:135|171)\d{8}$",strvar)
print(lst) # ['13566668888']

匹配www.baidu.com 或者 www.oldboy.com

strvar = "www.baidu.com www.lagou.com www.oldboy.com"
lst = re.findall(r"(?:www).(?:baidu|oldboy).(?:com)",strvar)
print(lst) # search 的用法
strvar = "www.baidu.com www.lagou.com www.oldboy.com"
obj = re.search(r"www\.(baidu|oldboy)\.(com)",strvar) # 返回的是匹配到的结果
res = obj.group()
print(res) # 通过group和下标可以获取到括号的内容(了解)
print(obj.group(1))
print(obj.group(2)) # 返回的是括号分组里面的内容
res = obj.groups()
print(res)

findall和search的qubie

1. findall 是把 所有符合条件的内容都匹配出来放到列表里, 不能够把匹配到的结果和分组当中的内容显示在同一个界面当中

2. search 按照正则表达式,把第一次匹配到的内容返回出来,返回的是对象,能够把匹配到的结果和分组当中的内容显示在同一个界面当中

  对象 group 返回的是匹配到的结果

  对象groups  返回的是括号分组里面的内容

  如果匹配不到内容,返回的是None  无法调用group 或者 groups方法

匹配  5*6-7/3   计算出最后的结果

strvar = "5*6-7/3"

# 匹配5*6
obj = re.search(r"\d+[*/]\d+",strvar)
print(obj)
strvar1 = obj.group()
print(strvar1,type(strvar1),"<===>") # 5*6 <class 'str'> <===> # 计算5*6
num1,num2 = strvar1.split("*")
print(num1,num2)
strvar2 = str(int(num1) * int(num2))
print(strvar2 ,type(strvar2)) # "30" # 替换5*6 为字符串30
strvar3 = strvar.replace(strvar1,strvar2)
print(strvar3 , type(strvar3)) # 30-7/3 <class 'str'> # 匹配7/3
obj = re.search(r"\d+[*/]\d+",strvar3)
print(obj)
strvar4 = obj.group()
print(strvar4) # 7/3 # 计算7/3
num1,num2 = strvar4.split("/")
strvar5 = str(int(num1) / int(num2))
print(strvar5 , type(strvar5)) # 替换7/3 为字符串2.333333333333
strvar6 = strvar3.replace(strvar4,strvar5)
print(strvar6 , type(strvar6)) # 计算 30-2.3333333333333335 得出最后的结果
num1,num2 = strvar6.split("-")
res = float(num1) - float(num2)
print(res)

命名分组

反向引用

strvar = "<div> 今天天气不错~ </div>"
lst = re.findall("<(.*?)>(.*?)<(.*?)>",strvar)
print(lst) # [('div', ' 今天天气不错~ ', '/div')] # 反向引用 : 在匹配到的值,在引用一次
'''\1 把第一个小括号里面的内容,拿出来在匹配一下'''
lst = re.findall(r"<(.*?)>(.*?)<(/\1)>",strvar)
print(lst) # [('div', ' 今天天气不错~ ', '/div')] # \1 代表反向引用第一个括号 \2代表反向引用第二个括号
strvar = "a1b2cab"
# strvar = "f1z2pfz"
obj = re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar)
print(obj) # <_sre.SRE_Match object; span=(0, 7), match='a1b2cab'>
# 获取匹配到的内容
res1 = obj.group()
print(res1) # a1b2cab
# 获取分组里面的内容
res2 = obj.groups()
print(res2) # ('a', 'b', 'c')

命名分组

"""
(?P<组名>正则表达式) 给这个组起一个名字
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
""" # 方法一
strvar = "a1b2cab"
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2",strvar)
# 获取匹配到的内容
res1 = obj.group()
print(res1)
# 获取分组里面的内容
res2 = obj.groups()
print(res2) # 方法二
strvar = "a1b2cab"
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)",strvar)
# 获取匹配到的内容
res1 = obj.group()
print(res1)
# 获取分组里面的内容
res2 = obj.groups()
print(res2)

正则函数

1. search  通过正则匹配出第一个对象返回,通过group取出对象中的值

# search   通过正则匹配出第一个对象返回,通过group取出对象中的值
strvar = "1+2 3*4"
obj = re.search("\d+(.*?)\d+",strvar)
print(obj)
# 返回匹配到的内容(匹配到一个就返回)
res = obj.group()
print(res) # <_sre.SRE_Match object; span=(0, 3), match='1+2'>
# 返回分组里面的内容,类型是元组
tup = obj.groups()
print(tup[0]) # 1+2

match  验证用户输入内容

# match    验证用户输入内容(了解)
"""当search函数里面的正则表达式前面加上^ 等价于 matth的用法"""
strvar = "a13566668888"
obj = re.search("^\d+",strvar)
print(obj)
# print(obj.group())
obj = re.match("\d+",strvar)
print(obj)
# print(obj.group())

split  切割

# split    切割
strvar = "alex|xboyww&wusir%ritian"
res = re.split("[|&%]",strvar)
print(res) # ['alex', 'xboyww', 'wusir', 'ritian'] strvar = "alex234234xboyww6786wusir78967896ritian"
res = re.split("\d+",strvar) # ['alex', 'xboyww', 'wusir', 'ritian']
print(res)

sub 替换

# sub      替换
"""sub(正则,要替换的字符,原字符串[,次数])"""
strvar = "alex|xboyww&wusir%ritian"
res = re.sub("[|&%]","-",strvar)
print(res) # alex-xboyww-wusir-ritian
strvar = "alex|xboyww&wusir%ritian"
res = re.sub("[|&%]","-",strvar,2)
print(res) # alex-xboyww-wusir-ritian

subn 替换

# subn     替换 (用法和sub一样,区别在于返回的是元组 (结果,次数)  )
strvar = "alex|xboyww&wusir%ritian"
res = re.subn("[|&%]","-",strvar)
res = re.subn("[|&%]","-",strvar,1)
print(res)

finditer  返回字符串中响应内容,返回迭代器

# finditer 匹配字符串中相应内容,返回迭代器[迭代器中包含的是对象]
from collections import Iterator , Iterable
strvar = "jkasdfjkadfjk1234asfj2342kfa"
it = re.finditer("\d+",strvar)
print(isinstance(it,Iterator)) # 获取迭代器里面的内容
for i in it:
print(i.group())

compile 指定一个统一的匹配规则

# finditer 匹配字符串中相应内容,返回迭代器[迭代器中包含的是对象]
from collections import Iterator , Iterable
strvar = "jkasdfjkadfjk1234asfj2342kfa"
it = re.finditer("\d+",strvar)
print(isinstance(it,Iterator)) # 获取迭代器里面的内容
for i in it:
print(i.group())

正则表达式装饰符

# ### 正则表达式修饰符
# re.I 使匹配对大小写不敏感
strvar = "<h1>72347923489</H1>"
pattern = re.compile(r"<h1>(.*?)</h1>",flags=re.I)
obj = pattern.search(strvar)
print(obj)
print(obj.group()) # re.M 使每一行都能够单独匹配(多行),影响 ^ 和 $
strvar = """<h1>72347923489</H1>
<p>72347923489</p>
<li>72347923489</li>
"""
pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M)
lst = pattern.findall(strvar)
print(lst) # re.S 使 . 匹配包括换行在内的所有字符
strar = """give
1234234234mefive
"""
pattern = re.compile("(.*?)mefive",flags=re.S)
obj = pattern.search(strar)
print(obj)
print(obj.group()) # 可以加多个修饰符 通过| 拼接
"""
pattern = re.compile("(.*?)mefive",flags=re.S|re.I|re.M)
"""

Python ( 高级 第一部)的更多相关文章

  1. Python ( 高级 第二部)

    目录 模块和包 面向对象 部分一: 面向对象程序开发 面向对象封装: 对象的相关操作 面向对象封装: 类的相关操作 实例化的对象/ 定义的类删除公有成员属性和公有成员方法 部分二: 单继承 多继承 菱 ...

  2. 第一篇:python高级之函数

    python高级之函数   python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...

  3. python 高级之面向对象初级

    python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...

  4. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  5. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  6. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  7. python高级之操作数据库

    python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...

  8. 第九篇:python高级之操作数据库

    python高级之操作数据库   python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...

  9. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  10. 第四篇:python 高级之面向对象初级

    python 高级之面向对象初级   python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 ...

随机推荐

  1. 更改jenkins插件地址为国内源地址

    1.在插件管理里替换源地址 在这个界面往下拉,可看到URL地址,将其替换为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-ce ...

  2. 搭建漏洞环境及实战——在Windows系统中安装WAMP

    安装成功之后,打开显示 链接:https://pan.baidu.com/s/1NpU7fUYOO_CSM8dNXKdnCw 提取码:mxvw

  3. texlive2021编译中文

    环境 Windows 10 编译 测试latex代码 \documentclass{article} \usepackage[UTF8]{ctex} \begin{document} 中文输入 \en ...

  4. python与数值计算环境安装

    数值计算的编程的软件很多种,也见过一些编程绘图软件的对比. 利用Python进行数值计算,需要用到numpy(矩阵) ,scipy(公式符号), matplotlib(绘图)这些工具包. 1.Linu ...

  5. day14-功能实现13

    家居网购项目实现013 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 32.功能30-会员不能登录后台管理 32.1需求分析/ ...

  6. ★k倍区间【第八届蓝桥杯省赛C++B组,第八届蓝桥杯省赛JAVAB组】

    k倍区间 给定一个长度为 \(N\) 的数列,\(A1,A2,-AN\),如果其中一段连续的子序列 \(Ai,Ai+1,-Aj\) 之和是 \(K\) 的倍数,我们就称这个区间 \([i,j]\)是 ...

  7. Java进阶篇——设计模式

    设计模式 一.代理模式 使用代理类对真实对象进行代理,包括真实对象方法的调用.功能的扩展等.访问的时候也只能访问到代理对象,既保护了真实对象同时可以在原始对象上进行扩展.类似于中介在卖家和买家之间的角 ...

  8. Java学习笔记 :2021年12月31日 上午

    Java学习笔记 :2021年12月31日 上午 目录 Java学习笔记 :2021年12月31日 上午 关于计算机语言 1.关于语言的分类 2.小结 关于Java语言的基础语法 1.主方法 2.其他 ...

  9. Educational Codeforces Round 33 (Rated for Div. 2) 虚拟赛体验

    前言 就只做出了 \(A,B,C,D\) 是不是很弱? A.Chess For Three A,B,C 三人下棋,A和B先下,每次下完棋之后由现在观战的人(例如第一局就由C)代替下输的人. 每次输入一 ...

  10. 终端安装python3使用如下指令

    ''' brew install python3 ''' 会报错,报错如下:Cannot install in Homebrew on ARM processor in Intel default p ...