一 OS模块
os模块的主要功能:
-
访问和操作系统相关信息
-
操作目录及文件
-
执行系统命令
-
管理进程(到后面学习到并发编程再学这个)
常用属性 | os.environ:获取当前操作系统的环境变量 |
import os |
环境变量 | 读取环境变量 |
# 如果有这个键,返回对应的值,如果没有,则返回 none。 |
新增环境变量 |
# os.environ['变量名'] = '变量值' |
|
更新环境变量 |
# 针对已经存在的环境变量,直接改值,就可以达到修改环境变量的效果,但是python程序执行结束以后,会重新恢复的。 |
|
删除环境变量 |
# del(os.environ['变量名']) |
|
判断环境变量是否存在 |
# '变量名' in os.environ # 存在返回 True,不存在返回 False |
|
文件操作 |
os.remove(path):删除文件,不能删除目录,文件不存在则报错 os.rename(src, dst):重命名文件,src源文件不存在,或dst新文件名已存在都会报错。 |
"""os.remove() 删除一个指定路径的文件""" !!!删除之前确定文件是否存在 |
目录操作 |
os.mkdir():新建空目录,目录存在,则报错。 os.listdir(path="."):列出指定目录下所有文件组成的列表,不指定path,则默认当前程序所在的工作目录 os.makedirs():创建多级目录,如果多级目录重叠则报错,部分重叠不会报错。mkdir -p |
"""os.mkdir() 新建空目录""" # # 重复创建一样报错,如果不希望报错,设置exist_ok的值为True # 根据当前时间来创建 |
路径操作 |
os.path.isdir():判断name是不是一个目录,name不是目录就返回false os.path.isfile():判断name是不是一个文件,不存在返回false os.path.dirname(filename):返回文件路径的目录部分 os.path.basename(filename):返回文件路径的文件名部分 os.path.join(dirname,basename):将文件路径和文件名凑成完整文件路径 os.path.abspath(name):获得绝对路径 os.path.getatime():返回最近访问时间 浮点型 os.path.getmtime():返回上一次修改时间 浮点型 os.path.getctime():返回文件创建时间 浮点型 os.path.getsize():返回文件大小 字节单位 os.path.exists():判断文件或目录是否存在
|
""" os.path.isdir() 判断name是不是一个目录,name不是目录就返回false""" |
系统参数与命令执行 | os.popen(command):创建一个命令管道对象,通往 cmd/shell终端。返回值是连接到管道的文件对象。 |
# popen 执行终端命令 # 如果要执行多条命令,务必要写在一块,一并执行用&&连接多条命令 ret = os.popen(command) |
附:
1 目录操作的应用
import os def rmdir(path): """ 递归删除多层非空目录文件 :param path: 要删除的路径 :return: None """ if os.path.isfile(path): os.remove(path) return # 阻止代码继续往下执行 elif os.path.isdir(path): # 切换工作目录 os.chdir(path) for item in os.listdir(): # 判断是否是文件 if os.path.isfile(item): # 删除文件 os.remove(item) else: # 删除多级目录 rmdir(item) # 返回上一级目录 os.chdir("..") # 把当前目录删除 os.rmdir(path) else: print("路径有误!") rmdir("home")
二 shutil模块
shutil模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除、复制、移动的操作。
方法 | 描述 | 示例 |
copy(src,dst) | 复制文件权限和内容 |
""" copy(src,dst) 复制文件权限和内容,src必须存在,dst不存在则自动创建 """ |
copytree(src,dst) | 复制文件夹里所有内容(递归复制) |
""" copytree(src,dst) 递归文件夹里所有内容 """ |
rmtree(path) | 递归删除文件或者目录 |
""" rmtree(path) 递归删除当前文件夹及其中所有内容""" |
move(src,dst) | 移动文件或者文件夹 |
""" move(path1, paht2) 移动文件或者文件夹""" |
三 sys模块
sys模块主要是针对与Python解释器相关的变量和方法,不是针对主机操作系统的。
属性/方法 | 描述 | 示例 |
sys.path | 返回python解释器的搜索模块与包路径,默认使用环境变量PYTHONPATH的值 |
"""sys.path python导包路径列表。提供给python用于from和import导包时搜索文件的路径列表 """ |
sys.platform | 返回操作系统平台名称,Linux系统是"linux", windows系统是"win32", max OS是"darwin" |
""" sys.platform 返回操作系统平台名称 """#比os.name好用 |
sys.modules | 返回系统导入的模块字段,key是模块名,value是模块 |
""" sys.modules 返回系统导入的模块字段,key是模块名,value是模块 """ |
sys.version_info | ‘final‘表示最终,也有‘candidate‘表示候选,表示版本级别,是否有后继的发行 |
""" sys.version_info ‘final‘表示最终,也有‘candidate‘表示候选,表示版本级别,是否有后继的发行 """ |
sys.argv | 命令行参数List,第一个元素是程序本身路径 |
""" |
sys.hexversion | 获取Python解释程序的版本值,16进制格式如:0x020403F0 |
""" sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0 """ |
sys.exit(n) | 退出程序,其实就是exit()函数 |
""" sys.exit(n) 退出程序,正常退出时exit() """ |
标准输入、标准输出以及标准错误输出(了解)
IO:I就是Input,译作输入,表示从外部设备输入到内存。O就是output,译作输出,表示从内存输出到外部设备。
而标准输入和标准输出就是用于IO操作的。在linux操作系统中,一切文件/目录/设备都是文件。因此所谓的标准输入、标准输出以及标准错误输出,其实就是linux系统下的3个默认文件,/dev/stdin、/dev/stdout、/dev/stderr。这3个文件并非普通文件,而是默认设备的链接文件。因此, 对三个文件的读写操作,本质上对系统默认输入和输出设备进行读写,系统默认的输入和输出设备默认一般是终端。当然,/dev/stdin、/dev/stdout、/dev/stderr仅仅是链接文件,并非真正的设备,他们之间的关系仅仅是关联。
描述 | 示例 | |
---|---|---|
sys.stdout | 标准输出文件对象 |
""" sys.stdout 标准输出 """ |
sys.stdout.write("内容") | 标准输出内容 |
""" sys.stdout.write() 标准输出内容 """ |
sys.stdout.writelines() | 无换行输出 |
""" sys.stdout.writelines() 无换行输出 """ |
sys.stdin | 标准输入文件对象 |
""" sys.stdin 标准输入 """ |
sys.stdin.read() | 输入一行 |
""" sys.stdin.read() 输入一行 """ |
sys.stdin.readline() | 从标准输入读一行,sys.stdout.write(“a”) 屏幕输出a |
""" sys.stdin.readline() 从标准输入读一行""" |
sys.stderr | 标准错误输出文件对象 |
""" sys.stderr 错误输出 """ |
sys.stderr.write("内容") |
sys.stderr.write('欢天喜地')#欢天喜地 |
四 文件压缩模块
zipfile模块 | tarfile模块 | |
基本使用 |
'''基本使用''' |
'''基本使用''' |
压缩文件 |
# 1. zipfile.ZipFile() 写模式w打开或者新建压缩文件 |
'''打包不压缩''' |
'''打包并压缩''' """gz, 使用gzip算法压缩打包""" |
||
解压文件 |
'''解压文件''' |
'''解压文件''' |
追压文件 |
'''追压文件''' |
"""追加打包""" |
查看包内容 |
'''查看包内容''' |
'''查看包内容''' |
附:1 解决tarfile追加不压缩
import tarfile, os """追加压缩""" # tarfile不支持直接追加压缩的,所以可以先解压,在打包压缩 # 1. 解压文件 path1 = "./backup/data.tar.bz2/" # 临时目录 with tarfile.open("data.tar.bz2", "r") as tf: tf.extractall(path1) # 2. 追加合并文件 # os.system("cp -a /home/moluo/Desktop/4.py " + path1) shutil.copy("/home/admin/Desktop/code/sysdemo.py", path1) # 复制文件 shutil.copytree("/home/admin/Desktop/code/demo2", f"{path1}/demo2") # 复制目录 # 3. 重新打包 list_file = os.listdir(path1) # print(list_file) # 4. 创建一个新的bz2模式的压缩包 with tarfile.open("data_new.tar.bz2","w:bz2") as tf: # 循环遍历文件夹当中的所有内容 for file in list_file: # 拼接路径 file_path = os.path.join(path1, file) # tf.add (路径,别名) tf.add(file_path, file) # 5. 删除临时目录 shutil.rmtree("./backup")
2 基于生成器来提取tar大文件中指定内容[yield:占用一块内存空间]
import os import tarfile def tar_files(members): for tarinfo in members: if os.path.splitext(tarinfo.name)[1] == ".py": # 过滤条件 yield tarinfo with tarfile.open("data_new.tar.bz2", "r") as tf: tf.extractall("./new_data", members=tar_files(tf))#接收yield的返回值,存储到new_data路径
五 日志处理
1. 说明:日志,是记录和跟踪程序运行过程中所发生的事件的文件内容。python内置了一个标准库模块logging用于记录程序运行过程的日志信息。开发人员可以提前在代码中调用日志功能来记录程序执行过程中是否会发生了某些日志事件,如文件被误删了,数据读取失败了,用户注册账号失败等。
开发中,一个事件的发生就会记录一条对应的日志信息,而一个日志信息通常需要包括事件相关的以下几个内容:
-
事件发生时间-年月日时分秒
-
事件发生位置-所在的文件路径或网址路径
-
事件的严重程度–日志level级别
-
事件内容-日志内容
上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息(如进程ID、进程名称、线程ID、线程名称等)。日志格式就是用来定义一条日志记录中包含那些字段的,且日志格式通常都是可以自定义的。
logging模块默认定义了以下几个日志等级
日志等级 (level) | 等级 (从低到高) | 描述 |
---|---|---|
loging.DEBUG | 10 | 调试级别,在程序出现异常时,开发人员会使用DEBUG日志来进行问题诊断。 |
loging.INFO | 20 | 运行级别,记录一些关键信息到日志中让开发人员确认程序是正常运行的。 |
loging.WARNING | 30 | 警告级别,记录如某些函数被废弃了或服务器磁盘可用空间较低等情况。 |
loging.ERROR | 40 | 错误级别,记录程序运行时导致程序运行终止的错误信息,如调用了未定义的函数等情况。 |
loging.CRITICAL | 50 | 致命级别,记录让程序不能启动不能运行的危险错误信息,如语法错误等情况。 |
注意:
1. 日志严重等级是从上到下依次升级的,即:DEBUG < INFO < WARNING(WARN) < ERROR < CRITICAL(FATAL)
2. 当程序中指定一个日志级别后,程序会记录所有大于或等于指定级别的日志信息,
import logging # LOG_FORMAT = "{日志时间} {日志记录器名称} {日志等级名称} {程序路径}:{行号} {日志信息} " LOG_FORMAT = "{asctime}{name} {levelname} {pathname}:{lineno} {message} " # 配置输出时间的格式 DATE_FORMAT = '%Y-%m-%d %H:%M:%S %A ' # %A周几 # 通过 logging.basicConfig 进行简单日志配置 logging.basicConfig( level=logging.INFO, # 会输出到日志信息中的日志级别(大于或等于该级别) format=LOG_FORMAT, # 日志格式 datefmt = DATE_FORMAT , # 时间格式 filename="demo.1.log", # 记录日志到文件 style="{" ) # 经过上面配置好的简单日志,接着就可以直接使用日志 logging.debug("调试代码") logging.info("记录程序是否正常运行") logging.warning("记录程序运行过程中的警告信息") logging.error("记录程序运行过程中的异常/错误信息") ''' 2022-04-17 21:16:33 Sunday root INFO /Users/zm/PycharmProjects/demo/test.py:187 记录程序是否正常运行 2022-04-17 21:16:33 Sunday root WARNING /Users/zm/PycharmProjects/demo/test.py:188 记录程序运行过程中的警告信息 2022-04-17 21:16:33 Sunday root ERROR /Users/zm/PycharmProjects/demo/test.py:189 记录程序运行过程中的异常/错误信息 '''
注:
2.1 fomat格式字符串参数
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒 |
name | %(name)s | 所使用的日志器名称,默认是’root',因为默认使用的是 rootLogger |
filename | %(filename)s | 调用日志输出函数的模块的文件名; pathname的文件名部分,包含文件后缀 |
levelname | %(levelname)s | 日志的最终等级(被filter修改后的) |
message | %(message)s | 日志信息, 日志记录的文本内容 |
lineno | %(lineno)d | 当前日志的行号, 调用日志输出函数的语句所在的代码行 |
pathname | %(pathname)s | 完整路径 ,调用日志输出函数的模块的完整路径名,可能没有 |
process | %(process)s | 当前进程, 进程ID。可能没有 |
thread | %(thread)s | 当前线程, 线程ID。可能没有 |
module | %(module)s | 调用日志输出函数的模块名, filename的名称部分,不包含后缀即不包含文件后缀的文件名 |
2.2 longging.basicConfig函数参数
描述 | |
---|---|
filename | 指定日志输出目标文件的文件名(可以写文件名也可以写文件的完整的绝对路径,写文件名日志放执行文件目录下,写完整路径按照完整路径生成日志文件),指定该设置项后日志信心就不会被输出到控制台了 |
filemode | 指定日志文件的打开模式,默认为’a'。需要注意的是,该选项要在filename指定时才有效 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。 |
datefmt | 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 |
level | 指定日志器的日志级别 |
stream | 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError 异常 |
style | Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值为'%'、'{‘和’$',默认为'%' |
handlers |
3 详细日志配置
3.1 logging模块的四大组件:
组件名称 | 对应类名 | 功能描述 | 使用参数格式 | 组件关系 |
日志器 | Logger | 提供了应用程序可一直记录日志的对象 |
logging.getLogger([name]) (返回一个logger日志器对象,如果没有指定名字将返回root logger) |
这些组件之间的关系描述:
|
处理器 | Handler |
将logger创建的日志记录发送到合适的目的地进行输出的对象。 基于日志消息的等级将日志信息分发到预先指定的位置(文件、网络、邮件等)。Logger日志器对象可以通过addHandler()方法为自己添加0个/更多个handler处理器对象。
|
Handler.setLevel(lel): # 指定被处理的信息级别,低于lel级别的信息将被忽略
# 给这个handler选择一个格式器对象进行日志进行格式化输出
新增或删除一个filter过滤器对象
|
|
常用的Hadler处理器 |
||||
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
源代码中filter的基本格式: class logging.Filter(name='')
|
|
格式器 | Formatter | 决定日志记录的最终输出的字段格式 |
logging.Formatter(fmt=None, datefmt=None, style='%') 该构造方法接收3个可选参数: fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值 datefmt:指定日期格式字符串,如果不指定该参数则默认使用”%Y-%m-%d %H:%M:%S" style:Python 3.2新增的参数,可取值为 ‘%’, ‘{‘和 ‘$',如果不指定该参数则默认使用’%’ |
3.2 日志流处理流程
1、创建一个日志器对象logger
2、设置日志器logger的通用日志等级level
3、创建合适数量的Handler处理器对象(其中,如果日志输出到文件中,则要有日志的存储路径)
4、设置每个Handler处理器单独的日志等级level
5、创建合适数量的格式器formatter,对日志格式化
6、向Handler处理器中添加格式器对象formatter
7、将上面创建的Handler处理器添加到日志器logger中
8、最终在异常处理过程中,打印输出日志
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
示例:
import logging def log(name): # 创建logger,如果参数name表示日志器对象名,name为空则返回root logger logger = logging.getLogger(name) # 务必设置一个初始化的日志等级 logger.setLevel(logging.DEBUG) # 这里进行判断,如果logger.handlers列表为空则添加,否则多次调用log日志函数会重复添加 if not logger.handlers: #添加handler的时候一定要判断,不要重复添加造成重复打印日志的bug! # 创建handler fh = logging.FileHandler("test.log", encoding="utf-8") sh = logging.StreamHandler() # 单独设置logger日志等级 fh.setLevel(logging.INFO) # 设置输出日志格式 simple_formatter = logging.Formatter( fmt="{levelname} {asctime} {name} {module}:{lineno} {message}", datefmt="%Y/%m/%d %H:%M:%S", style="{" ) verbose_formatter = logging.Formatter( fmt="{levelname} {asctime} {name} {pathname}:{lineno} {message}", datefmt="%Y/%m/%d %H:%M:%S", style="{" ) # 为handler指定输出格式 fh.setFormatter(verbose_formatter) sh.setFormatter(simple_formatter) # 为logger添加的日志处理器 logger.addHandler(fh) logger.addHandler(sh) return logger # 直接返回logger logger = log("小明") logger.debug("查错") logger.info("提示") logger.warning("警告") logger.error("错误") logger.critical("危险") ''' DEBUG 2022/04/17 22:07:15 小明 test:230 查错 INFO 2022/04/17 22:07:15 小明 test:231 提示 WARNING 2022/04/17 22:07:15 小明 test:232 警告 ERROR 2022/04/17 22:07:15 小明 test:233 错误 CRITICAL 2022/04/17 22:07:15 小明 test:234 危险 '''
3.3 日志配置模式:
通过字典、yaml、json格式对日志的配置信息进行统一配置,然后实现日志处理。最终效果与上面一样。
六 异常处理基础
当Python解释器检测到运行的程序出现错误时,解释器就无法继续执行代码或者继续执行下去会导致未知的结果出现,python解释器就会输出一些错误的提示
# 容错语句 # 可以主动抛异常, 异常可以通过自定义的方式实现自己的提示错误(面向对象会涉及到) |
示例1
import os file = "1.zip" try: # 尝试执行缩进语句块的代码 f = open(file, "r") content = f.read() # try语句块中一旦出现异常,则异常代码往下的代码就不会被执行,会自动跳到except里面 return content #函数遇到return以后,就会结束不会往下继续执行了。!!但是这个规则遇到finally要让步 except FileNotFoundError: # 捕获错误,一个try可以跟着1个或多个except语句 print("文件读取错误!不存在的文件!") except UnicodeDecodeError: ext = os.path.basename(file).split(".")[-1] print(f"文件读取错误!不能读取{ext}格式的文件!") except: # 注意:一般都要在最后对前面的except没有捕获到的错误,进行最后一步的错误 print("文件读取错误!未知错误!") else: # 如果代码执行到任意一个except语句块,则不会执行else语句块 print("文件正常读取完毕!") finally: # 针对网络请求,特殊文件读写,就要在程序运行结果以后,不管是否发生了异常,都要关闭 f.close()
示例2 抛出异常语句
num = input("请输入输入一个手机号码:") if not num.isdecimal() or len(num) != 11: raise Exception("不是手机号码哦!")
示例3 查看异常信息
"""查看异常信息""" try: 1 / 0 except Exception as e: print(e) #division by zero # 打印错误的提示内容,一般用于提示给用户,或者记录到日志中 info = sys.exc_info() #返回当前异常信息 print(info) # (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x7f4e01bef900>) print(info[-1].tb_lineno) # 异常出现的行号 # 11 print(info[-1].tb_frame.f_code.co_filename) # 异常出现的文件路径
2. 常见的内置异常
类名 | 描述 |
---|---|
Exception | 未知异常,所有异常的总类型,一般用于主动抛出异常或者自定义异常 |
IndexError | 索引超出序列的范围,操作列表,元组,类列表对象,类元组对象 |
KeyError | 字典中查找一个不存在的关键字 |
NameError | 尝试访问一个不存在的变量 |
IndentationError | 缩进错误 |
AttributeError | 尝试访问未知的对象属性 |
AssertionError | 断言语句(assert)失败,用于单元测试(unit test) |
GeneratorExit | generator.close()方法被调用的时候 |
ImportError | 导入模块失败的时候 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统产生的异常(例如打开一个不存在的文件) |
ReferenceError | 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 |
RuntimeError | 一般的运行时错误 |
SyntaxError | Python的语法错误 |
TypeError | 不同类型间的无效操作 |
UnicodeError | Unicode相关的错误(ValueError的子类) |
UnicodeEncodeError | Unicode编码时的错误(UnicodeError的子类) |
UnicodeDecodeError | Unicode解码时的错误(UnicodeError的子类) |
ValueError | 传入无效的参数 |
1. 定义:正则模式分2部分组成,分别是原子和元字符。元字符一般都会写在原子的后面(右边)。
-
-
元字符,就是对左边的原子的数量或类型进行补充描述的特殊代码。
元字符 | 描述 | 示例 |
[] | 匹配一个中括号中出现的任意原子 |
import re |
[^原子] | 匹配一个没有在中括号出现的任意原子 |
"""[^] 匹配一个没有在中括号出现的任意原子""" |
\ | 转义字符,可以把原子转换特殊元字符,也可以把特殊元字符转成原子。 |
# 因为正则中[]表示任选其一的原子,而[]里面出现^表示对没在中括号里面的原子任选其一 # [0-9] 还可以使用\d表示 |
^ | 叫开始边界符或开始锚点符,匹配一行的开头位置 |
txt = " hello, world" |
$ | 叫结束边界符或结束锚点符,匹配一行的结束位置 |
ret = re.findall("d$", txt) |
. | 叫通配符、万能通配符或通配元字符,匹配1个除了换行符\n以外任何原子 |
""" . 通配符,匹配1个除了换行符\n以外任何原子 """ |
* | 叫星号贪婪符,指定左边原子出现0次或多次 |
""" * 星号贪婪符, 匹配0个或者多个a """ |
? | 叫非贪婪符,指定左边原子出现0次或1次 |
""" ? 非贪婪符,匹配0个或者1个原子 """ |
+ | 叫加号贪婪符,指定左边原子出现1次或多次 |
""" + 加号贪婪符,匹配1个或者多个原子 """ |
{n,m} | 叫数量范围贪婪符,指定左边原子的数量范围,有{n},{n, }, {,m}, {n,m}四种写法,其中n与m必须是非负整数。 |
""" {m,n} 范围贪婪符,匹配m个至n个原子 |
| | 指定原子或正则模式进行二选一或多选一 |
""" | 指定原子或正则模式进行二选一或多选一 """ |
() | 对原子或正则模式进行捕获提取和分组划分整体操作 |
""" () 对原子或正则模式进行捕获提取和分组操作 """ |
元字符 | 描述 | 示例 |
\d |
txt = "1alala2" |
|
\n | 匹配一个换行符 |
""" \n 1个换行符原子 """ |
\s | 匹配一个任何空白字符原子,包括空格、制表符、换页符等等。 |
"""\s 匹配一个任何空白字符原子""" |
\w |
"""\w 匹配一个包括下划线的单词原子 等价于[A-Za-z0-9_]。""" |
4 re模块
python本身没有内置正则处理的,python中的正则就是一段字符串,我们需要使用python模块中提供的函数把字符串发送给正则引擎,正则引擎会把字符串转换成真正的正则表达式来处理文本内容。
函数 | 描述 | 示例 |
---|---|---|
findall | 按指定的正则模式查找文本中所有符合正则模式的匹配项,以列表格式返回结果。 |
txt = "His name is iron man, He's Amazing" |
search | 在字符串中任何位置查找首个符合正则模式的匹配项,存在则返回re.Match对象,不存在返回None |
txt = "我今年18岁,我的弟弟比我小13岁" |
match | 判定字符串开始位置是否匹配正则模式的规则,匹配则返回re.Match对象,不匹配返回None |
ret = re.match("1[3-9]\d{9}","13928835900,这是我的手机号码") |
split | 按指定的正则模式来分割字符串,返回一个分割后的列表 |
txt = "my name is mike" |
sub | 把字符串按指定的正则模式来查找符合正则模式的匹配项,并可以替换一个或多个匹配项成其他内容。 |
txt = "my name is mike" """模式的反向引用,模式的反向捕获""" |
5 正则进阶
5.1 匹配/模式分组
字符 | 功能 | 示例 |
---|---|---|
a|b | 匹配左右任意一个模式,a与b代表的是一段任意的正则模式 |
ret = re.search(r"(www)\.(baidu|tmall)\.(com)", "www.tmall.com") txt = """<h1>这是web前端代码</h1> <a href="javascript:void(0);">更换城市</a> <li><a href="javascript:void(0);">北京市</a></li>""" """取消模式分组""" |
(ab) | 将括号中字符作为一个分组,表示一个整体,a与b代表的是一段任意的正则模式 | |
\num |
引用分组num匹配到的字符串,num是一个正整数,代表的是前一个参数里面的对应位置的小括号中的模式。 |
"""模式的反向引用,模式的反向捕获""" |
#大写P |
txt = """<h1>这是web前端代码</h1> <a href="javascript:void(0);">更换城市</a> <li><a href="javascript:void(0);">北京市</a></li>""" |
5.2 贪婪模式
Python里关于数量词的元字符在匹配查找的时候,总是尝试尽可能多的匹配符合正则模式的字符内容,为贪婪匹配的行为。非贪婪模式则相反,总是尝试尽可能少的匹配符合正则模式的字符内容。
在"*","?","+","{m,n}"后面加上?,则可以是使贪婪变成非贪婪
txt = "My computer IP is 192-168-21-253" ret = re.match(".+(\d+-\d+-\d+-\d+)",txt) print(ret.group(1)) # '2-168-21-253' ret=re.match(".+?(\d+-\d+-\d+-\d+)",txt) print(ret.group(1)) # '192-168-21-253'
5.3 模式修正符
修正符 | re模块提供的变量 | 描述 | 示例 |
---|---|---|---|
i | re.I | 使模式对大小写不敏感,也就是不区分大小写 |
"""I 修正符""" |
m | re.M | 使模式在多行文本中可以多个行头和行位,影响 ^ 和 $ |
txt = '''python, |
s | re.S | 让通配符. 可以代码所有的任意原子(包括换行符\n在内) |
"""S 修正符""" |
5.4 正则在文本处理方面的应用
正则经常用于数据提取,爬虫数据抓取工作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY