尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

python(很久前整理的笔记,有些乱,仅供参考)

python(很久前整理的笔记,有些乱,仅供参考) 学习网站白月黑羽视频网站收藏Janeyia的个人空间-Janeyia个人主页-哔哩哔哩视频记录历史记录Ⅰ、python基础篇1、如果字符串的内容有多行用三引号支持跨字符串就特别方便直观2.函数3、修改全局变量4、列表List-任何类型的对象、函数也可以是另一个列表nameList []支持sequence序列操作索引a[0]、切片a[1:2]5、元组(tuple)—任何类型的对象、函数也可以是另一个列表nametuple()支持sequence序列操作索引a[0]、切片a[1:2]区别元组的内容是不能改变但元组中的列表的内容可以改变6.a in var # 检查 a 是否在var 中存在存在返回True否则返回False7.字符串的方法find(查找内容,范围)返回查找字符串第一个出现的位置索引split切割分隔符本身在切割后会被丢弃掉分隔符前面有的空格字符会保留下来。splitlines()把字符串按换行符进行切割splitlines 方法经常用在文件处理中读出文件内容存入字符串然后调用字符串的 splitlines方法把每行内容依次存入列表。join是将列表中的字符串元素 以某字符串为连接符连接为一个字符串strip方法可以将 字符串前面和后面的空格删除但是不会删除字符串中间的空格lstrip方法 将 字符串前面 (左边) 的空格删除但是不会删除字符串中间和右边的空格rstrip方法 将 字符串后面 (右边) 的空格删除但是不会删除字符串中间和左边的空格replace替换字符串里面所有指定子字符串 为另一个 字符串startswith方法检查字符串是否以参数指定的字符串开头如果是返回True否则返回Falseendswith 方法检查字符串是否以指定的字符串结尾如果是返回True否则返回Falseisdigit检查字符串是否全部由数字构成如果是返回True否则返回False8.列表的方法append在后面添加一个元素注意append 方法的返回值是 None而不是新的列表对象。insert在指定位置插入一个元素insert方法的返回值也是 Nonepop从列表取出并删除元素的索引remove删除元素的值从第1个元素开始寻找 和参数对象 相等的元素如果找到了就删除。找到后不会继续往后寻找其它相等的元素。即remove 最多只会删除1个元素。remove 方法的返回值也是 Nonereverse将列表元素倒过来返回值也是 Nonesort 对列表进行排序调用sort 方法的列表中的元素通常都是是 数字 或者 字符串sort方法的返回值是None所以不要写这样的代码9.字符串的格式化print指定宽度与对齐10、字符串的格式化f-string在字符串模板前面加上f然后占位符使用{}指定宽度在括号里面的变量后面加上:宽度值左右对齐如果我们想指定左右对齐可以在括号里使用符号箭头朝左就是左对齐箭头朝右就是右对齐小数点后位数如果我们想指定小数点后保留几位可以像这样{salary:8.1f}后面的.1f就表示小数点后面保留1位不足补零数字在不足指定宽度的时候不是补空格而是补数字0可以像这样{salary:08}字符串不足补零就应该 使用符号或者同时指定左右对齐方式。16进制格式化数字字符串内容里有花括号 f-string 方式格式化的字符串内容本身就有{或者}符号一定要双写进行转义否则会被当成是 格式化占位符。11、for 循环:通常是从一个sequence类型eg:for student in studentAges: print(student)循环n次:for n in range(100):print(n)print(python)enumerate在使用for循环从列表或者元组中遍历元素的时候有时除了要获取每个元素还需要得到每个元素在列表元组里面的索引。可以使用 enumerate 函数。eg:找出下面列表中年龄大于17岁的学员打印出他们在列表中的索引studentAges [小王:17, 小赵:16, 小李:17, 小孙:16, 小徐:18] # enumerate (studentAges) 每次迭代返回 一个元组 # 里面有两个元素依次是 元素的索引和元素本身 for idx, student in enumerate(studentAges):#student.split(:)按冒号 : 分割[-1] 取列表最后一个元素也就是年龄字符串 if int(student.split(:)[-1]) 17: print(idx)return 从函数里面立即返回 函数体内的后续任何代码都不执行了break 只是结束整个循环 如果循环后面还有代码 会进行执行continue 结束当前这次循环12、列表推导式:把一个列表里面的每个元素经过相同的处理生成另一个列表。#2存1的平方 list1 [1,2,3,4,5,6] list2 [num**2 for num in list1]13、open 打开文件获得文件对象。file参数指定了要打开文件的路径。可以是相对路径比如 log.txt 就是指当前工作目录下面的log.txt 文件 也可以是绝对路径比如 d:\project\log\log.txtmode参数指定了文件打开的 模式 打开文件的模式 决定了可以怎样操作文件。常用的打开模式有r 只读文本模式打开这是最常用的一种模式默认w 只写文本模式打开a 追加文本模式打开encoding参数指定了读写文本文件时使用的 字符编解码 方式。后面调用write写入字符串到文件中open函数会使用指定encoding编码为字节串后面调用read从文件中读取内容open函数会使用指定encoding解码为字符串对象如果调用的时候没有传入encoding参数值open函数会使用系统缺省字符编码方式。 比如在中文的Windows系统上就是使用cp936就是gbk编码。read(n)#指定这次读取多少个字符,不传入该参数就是读取文件中所有的内容。readline()#返回一个列表,列表中的每个元素依次对应文本文件中每行内容。readline()每元素后换行--splitlines不换行14.用with 语句 打开文件,不需要我们调用close方法关闭文件。# eg:open返回的对象 赋值为 变量 f with open(tmp.txt) as f: linelist f.readlines() for line in linelist: print(line)f open(tmp.txt,w,encodingutf8) f.write(白月黑羽祝大家好运气) # 立即把内容写到文件里面 f.flush() # 等待 30秒再close文件 import time time.sleep(30) f.close()15.程序调试step overstep into运行当前断点行继续执行到下一个断点16.字典存放键值对数据,对象的内容是可以改变dict { key1 : vbalues1 , key2 : values2 }字典元素的键必须是可进行哈希值计算 (根据一个原始数据计算出一个结果数据)的对象 通常是数字或者字符串。值可以是任何类型的 对象修改添加pop方法删除元素判断字典是否存在某个keya in var# 检查 a 是否在var 中存在存在返回True否则返回Falseitems方法遍历字典返回结果keys方法 将字典 所有的键存入的 一个类似列表的对象values方法将字典 所有的值存入的 一个类似列表的对象clear 方法清空字典update方法:和另外一个字典合并,字典里面加上另外一个字典的内容17.自定义类自定义对象类型class BenzCar: #类名 首字母通常大写 brand 奔驰 # 品牌属性BenzCar类的属性 country 德国 # 产地属性 staticmethod#说明这是该类的一个 静态方法要调用执行该类的静态方法-BenzCar.pressHorn() def pressHorn(): #定义该类型的一个 方法 print(嘟嘟~~~~~~) def __init__(self,color,engineSN): self.color color # 颜色 self.engineSN engineSN # 发动机编号 def changeColor(self,newColor): self.color newColor class Benz2016(BenzCar):#子类Benz2016继承父类BenzCar price 580000 model Benz2016 class Benz2018(BenzCar): price 880000 model Benz2018 BenzCar.pressHorn() print(BenzCar.brand)#调用属性值18.匹配所有类型异常自定义异常定义了上面的异常当用户输入电话号码时出现相应错误的时候我们就可以使用raise关键字来抛出对应的自定义异常Ⅰ、python提高篇1、文件和目录操作1创建目录os.makedirs可以递归的创建目录结构比如import os os.makedirs(tmp/python/fileop,exist_okTrue) #会在当前工作目录下面创建 tmp目录在tmp目录下面再创建 python目录在Python目录下面再创建fileop目录exist_okTrue指定了如果某个要创建的目录已经存在也不报错2删除文件或目录os.remove可以删除一个文件shutil.rmtree():可以递归的删除 某个目录 和 该目录里面所有的子目录和子文件,比如os.remove(sdf.py)import shutil shutil.rmtree(tmp, ignore_errorsTrue) #注意参数 ignore_errors 值设置为 True 表示忽略删除过程中的错误比如要删除的目录不存在不会抛出异常。3拷贝文件可以使用shutil模块的copyfile函数。比如from shutil import copyfile # 拷贝 d:/tools/first.py 到 e:/first.py copyfile(d:/tools/first.py, e:/first.py) #注意如果拷贝前e:/first.py 已经存在则会被拷贝覆盖所以使用该函数一定要小心4拷贝目录及目录里面所有的内容到另外一个目录中使用shutil的copytree函数from shutil import copytree # 拷贝 d:/tools/aaa 目录中所有的内容 到 e:/bbb 中 copytree(d:/tools/aaa, e:/new/bbb) #注意拷贝前 目标目录必须 不存在 否则会报错。 #如果 e:/new 这个目录都不存在执行到copytree时就会 创建 e:/new 目录 #再创建 e:/new/bbb 目录再拷贝 d:/tools/aaa 目录中所有的内容 到 e:/new/bbb 中。5修改文件名、目录名使用os模块的rename函数。import os # 修改目录名 d:/tools/aaa 为 d:/tools/bbb os.rename(d:/tools/aaa,d:/tools/bbb) # 修改文件名 d:/tools/first.py 为 d:/tools/second.py os.rename(d:/tools/first.py,d:/tools/second.py) #注意Linux 系统上如果重命名之前 d:/tools/second.py 已经存在则会被覆盖所以使用该函数一定要小心。6判断文件、目录是否存在import os os.path.exists(d:/systems/cmd.exe) os.path.exists(d:/systems) #exists方法返回值为True表示 存在否则表示不存在。如果你要判断指定路径是否是文件可以这样import os # 返回值为True 表示是文件 os.path.isfile(d:/systems/cmd.exe)如果你要判断指定路径是否是目录可以这样import os # 返回值为True 表示是目录 os.path.isdir(d:/systems)7当前工作目录得到程序的当前工作目录的路径可以使用cwd os.getcwd()改变当前工作目录到另外的路径os.chdir(path)#参数就是 新的当前工作目录 路径地址。8递归的遍历目录下面所有的文件获取某个目录中所有的 文件 包括子目录里面的文件。 可使用os库中的walk方法import os # 目标目录 targetDir rd:\tmp\util\dist\check files [] dirs [] # 下面的三个变量 dirpath, dirnames, filenames # dirpath 代表当前遍历到的目录名 # dirnames 是列表对象存放当前dirpath中的所有子目录名 # filenames 是列表对象存放当前dirpath中的所有文件名 for (dirpath, dirnames, filenames) in os.walk(targetDir): files filenames dirs dirnames print(files) print(dirs)如果要得到某个目录下所有文件的全路径可以这样import os # 目标目录 targetDir rd:\tmp\util\dist\check for (dirpath, dirnames, filenames) in os.walk(targetDir): for fn in filenames: # 把 dirpath 和 每个文件名拼接起来 就是全路径 fpath os.path.join(dirpath, fn)9得到目录中所有的文件和子目录名import os # 目标目录 targetDir rd:\tmp\util\dist\check files os.listdir(targetDir)#listdir返回的是该目录下面所有的文件和子目录。 print(files)如果我们只需要获取目录中所有的文件或者只需要子目录可以这样import os from os.path import isfile, join,isdir # 目标目录 targetDir rd:\tmp\util\dist\check # 所有的文件 print([f for f in os.listdir(targetDir) if isfile(join(targetDir, f))]) # 所有的目录 print([f for f in os.listdir(targetDir) if isdir(join(targetDir, f))])10得到目录中指定扩展名的文件和子目录使用glob库import glob exes glob.glob(rd:\tmp\*.txt) print(exes)2.时间和日期主要使用datetime 、 time 和 calendar3个内置模块1获取当前时间对应的数字获取两个代码位置在执行时的时间差使用time.time()来做。import time before time.time() func1() after time.time()#time.time() 会返回 从 1970年1月1日0点所谓的epoch时间点 到 当前时间的 经过的秒数 可以简称为秒数时间。 print(f调用func1花费时间{after-before})2指定格式字符串显示时间得到当前时间对应的字符串可以这样实现from datetime import datetime str(datetime.now()) #得到类似这样的字符串2018-06-30 23:10:08.9114203指定输出的时间格式可以像下面这样datetime.now().strftime(%Y-%m-%d ** %H:%M:%S) #得到类似这样的字符串 2019-02-24 ** 16:56:55使用time库来格式化显示字符串time.strftime(%Y-%m-%d %H:%M:%S,time.localtime())4数字表示的时间转化为字符串表示/字符串时间转化为整数时间将某个指定秒数时间从epoch时间点开始计算转化为字符串格式time.strftime(%Y%m%d %H:%M:%S,time.localtime(1434502529))将字符串指定的时间转化为秒数时间可以这样int(time.mktime(time.strptime(2015-08-01 23:59:59, %Y-%m-%d %H:%M:%S)))5ISO格式 转化为 本地时间程序获取的时间是ISO 8601 格式的字符串转化为 本地时区 的字符串from datetime import datetime iso_string 2024-11-24T12:15:34Z#2008-09-03T20:56:35.450686Z 这种 Z 结尾的是UTC时间时区为0 #dt_utc datetime.fromisoformat(iso_string) -转为 datetime.datetime 类型UTC 时区 #dt_local dt_utc.astimezone() -转为 datetime.datetime 类型 本地 时区 retStr datetime.fromisoformat(iso_string)\ .astimezone().strftime(%Y-%m-%d %H:%M:%S)(6)获取某个时间 对应 的年月日时分秒数字,用datetime库 from datetime import datetime datetime.now() datetime.datetime(2018, 6, 30, 23, 3, 54, 238947) # 年 datetime.now().year 2018 # 月 datetime.now().month 6 # 日 datetime.now().day 30 # 时 datetime.now().hour 23 # 分 datetime.now().minute 7 # 秒 datetime.now().second 58 # 毫秒 datetime.now().microsecond 151169 # 获取星期几用 weekday方法 # 0 代表星期一1 代表星期二 依次类推 datetime.now().weekday() 5(7)获得指定时间字符串对应星期几使用 datetime类的 strptime方法先产生对应的 datetime对象# 要计算出 2018年6月24日 是星期几 thatDay 2018-6-24 from datetime import datetime # 先把字符串表示的日期转化为 datetime 对象 theDay datetime.strptime(thatDay, %Y-%m-%d) #再获取星期几 theDay.weekday()3.Python中调用外部程序主要是通过两个方法实现①os库的system函数:os.system函数把命令行内容 作为system函数的参数 即可比如我们要使用wget下载 nginx 安装包如果在命令行执行 是这样的d:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip #从网站http://mirrors.sohu.com/nginx下载nginx-1.13.9.zip压缩包到d盘tools\wget那么在Python程序中调用就可以像这样import os cmd rd:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip os.system(cmd) print(下载完毕)可以运行时让用户输入版本然后再填入命令行字符串中。import os version input(请输入安装包版本:) cmd frd:\tools\wget http://mirrors.sohu.com/nginx/nginx-{version}.zip os.system(cmd) print(下载完毕)os.system 函数没法获取 被调用程序输出到终端窗口的内容。 如果需要对被调用程序的输出信息进行处理的话 可以使用subprocess模块②subprocess 模块,可以获取外部程序输出到屏幕的内容。 这在自动化的时候 可以用来判断外部程序执行结果是否成功。如要分析当前C盘可用空间是否不足10%如果不足就显示空间告急,使用 subprocess里面的 Popen类。from subprocess import PIPE, Popen # 返回的是 Popen 实例对象 proc Popen( fsutil volume diskfree c:, stdin None, stdout PIPE, stderr PIPE, shellTrue) # communicate 方法返回 输出到 标准输出 和 标准错误 的字节串内容 # 标准输出设备和 标准错误设备 当前都是本终端设备 outinfo, errinfo proc.communicate() # 注意返回的内容是bytes 不是 str 我的是中文windows所以用gbk解码 outinfo outinfo.decode(gbk) errinfo errinfo.decode(gbk) print (outinfo) print (-------------) print (errinfo) outputList outinfo.splitlines() # 剩余量 free int(outputList[0].split(:)[1].replace(,,).split(()[0].strip()) # 总空间 total int(outputList[1].split(:)[1].replace(,,).split(()[0].strip()) if (free/total 0.1): print(!! 剩余空间告急) else: print(剩余空间足够)communicate 方法会返回 两个字符串对象。分别对应 被调用程序 输出到标准输出和标准错误的字节串内容。这个返回的是 bytes 字节串不是 str 字符串。bytes要解码为str就需要调用 decode方法。 我的是中文windows所以通常外部程序输出的都是gbk编码的字节串。 所以参数指定为gbk。os.system:它会等待 外部程序结束。subprocess里面的Popen:启动外部程序后Python程序本身并不需要等待外部程序结束。from subprocess import Popen proc Popen( argswget http://xxxxserver/xxxx.zip, shellTrue ) print (让它下载我们接下来做其他事情。。。。)4.多线程一个线程需要根据其他线程运行结束后的结果进行处理时可以使用 Thread对象的join方法thread.join()#在python程序中使用多线程 print(主线程执行代码) # 从 threading 库中导入Thread类 from threading import Thread from time import sleep # 定义一个函数作为新线程执行的入口函数 def threadFunc(arg1,arg2): print(子线程 开始) print(f线程函数参数是{arg1}, {arg2}) sleep(5) print(子线程 结束) # 创建 Thread 类的实例对象 # target即新线程要执行的函数。 #注函数对象只能写一个名字不能后面加括号如果加括号就是直接在当前线程调用执行而不是在新线程中执行了 # 如果 新线程函数需要参数在 args里面填入参数。注意参数是元组 如果只有一个参数后面要有逗号像这样 args(参数1,) thread Thread( targetthreadFunc, args(参数1, 参数2) ) # 执行start 方法就会创建新线程 # 并且新线程会去执行入口函数里面的代码。 # 这时候 这个进程 有两个线程了。 thread.start() thread.join()# 主线程会等待子线程结束才继续执行下面的代码 print(主线程结束)多线程对共享数据的访问控制from threading import Thread from time import sleep bank { byhy : 0 } # 定义一个函数作为新线程执行的入口函数 def deposit(theadidx,amount): balance bank[byhy] # 执行一些任务耗费了0.1秒 sleep(0.1) bank[byhy] balance amount print(f子线程 {theadidx} 结束) theadlist [] for idx in range(10): thread Thread(target deposit, args (idx,1) ) thread.start() # 把线程对象都存储到 threadlist中 theadlist.append(thread) for thread in theadlist: thread.join() print(主线程结束) print(f最后我们的账号余额为 {bank[byhy]})程序运行结果为1而不是10原因有多个线程并且在这个几个线程中都会去调用 deposit就有可能同时操作这个bank对象就有可能出一个线程覆盖另外一个线程的结果的问题。这时可以使用threading库里面的锁对象 Lock去保护共享数据的访问。from threading import Thread,Lock #加入Lock from time import sleep bank { byhy : 0 } bankLock Lock() #新增Lock类的实例对象 def deposit(theadidx,amount): # ***操作共享数据前申请获取锁 bankLock.acquire() balance bank[byhy] sleep(0.1) bank[byhy] balance amount print(f子线程 {theadidx} 结束) # ***操作完共享数据后申请释放锁 bankLock.release() theadlist [] for idx in range(10): thread Thread(target deposit, args (idx,1) ) thread.start() # 把线程对象都存储到 threadlist中 theadlist.append(thread) for thread in theadlist: thread.join() print(主线程结束) print(f最后我们的账号余额为 {bank[byhy]})结果为10。Python 的 threading 模块中所谓的 “daemon 线程” 是指一种后台线程其生命周期与主程序的生命周期紧密相关。普通线程非 daemon 线程只要程序中还存在未结束的普通线程主程序不会退出进程会继续运行直到所有非 daemon 线程结束。daemon 线程当程序中只剩下 daemon 线程时程序可以退出。也就是说只要所有非 daemon 线程都结束程序就会在 daemon 线程被强制终止前退出不等待 daemon 线程完成其任务。在 Python 中可以通过threading.Thread的daemon属性来设置线程是否为 daemon 线程。from threading import Thread from time import sleep def threadFunc(): sleep(2) print(子线程 结束) #创建 Thread 对象后、调用 start() 之前设置 daemon 属性 thread Thread(targetthreadFunc, daemonTrue # 设置新线程为daemon线程 ) thread.start() print(主线程结束)GIL 全局解释器锁每个线程要获得执行权限必须获取 GIL 。这导致多个线程 其实 并不能同时使用 多个CPU核心。所以如果是计算密集型的任务不能采用多线程的方式。多进程的基本使用与结果共享通过multiprocessing 的 Process 启动子进程必要时使用Manager 提供的跨进程共享对象来收集结果。from multiprocessing import Process,Manager from time import sleep def f(taskno,return_dict): sleep(2) # 存放计算结果到共享对象中 return_dict[taskno] taskno if __name__ __main__: manager Manager() # 创建 类似字典的 跨进程 共享对象 return_dict manager.dict() plist [] for i in range(10): p Process(targetf, args(i,return_dict)) p.start() plist.append(p) for p in plist: p.join() print(get result...) # 从共享对象中取出其他进程的计算结果 for k,v in return_dict.items(): print (k,v)5.JSON格式一种表示数据的语法格式最终是一个字符串与数据对象间转换数据对象序列化为json格式的字符串使用json库的dumps函数 json库中的 loads方法把json格式的字符串变为 Python中的数据对象。dumps函数常用参数json.dumps(obj, *, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, defaultNone, sort_keysFalse, **kw)obj要序列化的 Python 对象。常见类型包括dict、list、str、int、float、bool、None。不能序列化的对象需要通过default参数自定义序列化方式。indent缩进用于美化输出如果为None默认则输出紧凑的一行字符串如果为一个非负整数 n则每层缩进 n 个空格输出会带有换行和缩进便于阅读。示例indent4separators用来控制元素之间的分隔符。默认是(,, : )如果你想让输出更紧凑可以使用separators(,, :)。sort_keys若设为True输出的字典键将按字母序排序。ensure_ascii默认True使输出只包含 ASCII 字符。非 ASCII 字符会被转义为\uXXXX序列。若设为False则可以原样输出中文等非 ASCII 字符。示例ensure_asciiFalse输出会直接包含中文。default当遇到不可序列化的对象时调用的函数负责把该对象转换为可序列化的类型。函数签名应为default(obj)返回一个可序列化的对象或者抛出TypeError。import json historyTransactions [ { time : 20170101070311, # 交易时间 amount : 3088, # 交易金额 productid : 45454455555, # 货号 productname : iphone7 # 货名 }, { time : 20170101050311, # 交易时间 amount : 18, # 交易金额 productid : 453455772955, # 货号 productname : 奥妙洗衣液 # 货名 } ] # dumps 方法将数据对象序列化为 json格式的字符串 jsonstr json.dumps(historyTransactions) print(jsonstr)6.正则表达式是一种语法用来描述你想搜索的字符串的特征。用于高效从文本中提取信息。content Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员 测试开发工程师C/python 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员 Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人 测试开发工程师Python 赫里普上海信息科技有限公司上海-浦东新区1.1万/每月02-18剩余5人 Python高级开发工程师 上海行动教育科技股份有限公司上海-闵行区2.8万/月02-18剩余255人 python开发工程师 上海优似腾软件开发有限公司上海-浦东新区2.5万/每月02-18满员 import re for one in re.findall(r([\d.])万/每{0,1}月, content): print(one)正则表达式re.findall(r([\d.])万/每{0,1}月, content)([\d.])万/每{0,1}月即正则表达式字符串指定了 搜索子串的特征。findall 函数返回所有匹配的子串放在一个列表中表达式中特殊的元字符(贪婪的尽可能多匹配。使用非贪婪模式需在星号后面加上?).表示要匹配除了换行符之外的任何单个字符。*表示匹配前面的子表达式任意次包括0次。.**紧跟在 . 后面 表示 任意字符可以出现任意次表示匹配前面的子表达式一次或多次不包括0次。.紧跟在 . 后面?表示匹配前面的子表达式0次或1次。.?{ }花括号表示 前面的字符匹配指定的次数表达式油{3}就表示匹配 连续的 油 字 3次表达式油{3,4}就表示匹配 连续的 油 字 至少3次至多 4 次\对元字符的转义在文本中搜索有点.前后字符串内容,因为 点 是一个 元字符 直接出现在正则表达式中表示匹配任意的单个字符 不能表示 . 这个字符本身,应用使用这样的表达式 \.匹配某种类型的字符\d 匹配0-9之间任意一个数字字符等价于表达式 [0-9]\D 匹配任意一个非0-9数字的字符等价于表达式 [^0-9]\s 匹配任意一个空白字符包括 空格、tab、换行符等等价于表达式 [\t\n\r\f\v]\S 匹配任意一个非空白字符等价于表达式 [^ \t\n\r\f\v]\w 匹配任意一个文字字符包括大小写字母、数字、下划线等价于表达式 [a-zA-Z0-9_]缺省情况也包括 Unicode文字字符如果指定 ASCII 码标记则只包括ASCII字母\W 匹配任意一个非文字字符等价于表达式 [^a-zA-Z0-9_][ ] 方括号表示要匹配 指定的几个字符之一[abc] 可以匹配 a, b, 或者 c 里面的任意一个字符。等价于 [a-c] 。[a-c] 中间的 - 表示一个范围从a 到 c。[akm.] 匹配 a k m . 里面任意一个字符这里 . 在括号里面不在表示 匹配任意字符了而就是表示匹配 . 这个 字符如果在方括号中使用^ 表示 非 方括号里面的字符集合[^\d] 表示选择非数字的字符^表示匹配文本的开头位置。正则表达式可以设定单行模式和多行模式参数re.M 指明使用多行模式如果是单行模式表示匹配整个文本的开头位置。如果是多行模式表示匹配文本每行的开头位置。$表示匹配文本的结尾位置。参数 re.MULTILINE 指明了使用多行模式|表示 匹配 其中之一 。( )分组即 正则表达式的 组选择。
返回列表