什么是模块?
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
- 使用python编写的代码(.py文件)
- 已被编译为共享库或DLL的C或C++扩展
- 包好一组模块的包
- 使用C编写并链接到python解释器的内置模块
为何要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用
模块的使用
若想要使用一个模块,应该在程序开始的地方导入该模块,用 import 模块名
注意:
永远不要起一个py文件的名字,这个名字和你已知的模块同名
re模块中用到的几种方法
查找
findall:匹配所有内容,形成一个列表,每一项都是列表中的一个元素
ret = re.findall(‘\d+‘,‘sjkhk172按实际花费928‘) #正则表达式匹配 多位数字,对象是后面的字符串 print(ret) >>> [‘172‘, ‘928‘]
ret = re.findall(‘\d‘,‘sjkhk172按实际花费928‘) # 正则表达式匹配数字print(ret) >>> [‘1‘, ‘7‘, ‘2‘, ‘9‘, ‘2‘, ‘8‘]
search:只匹配符合条件的从左到右的第一个,得到的不是直接结果,而是一个变量,通过此变量的group方法来获得最后结果
如果没有匹配到符合条件的,则会返回None,使用group会报错
日常使用推荐用search,findall因一次找到所有匹配项,占内存, match相当于search的正则表达式中加了一个"^"
ret = re.search(‘\d+‘,‘sjkhk172按实际花费928‘) print(ret) >>><re.Match object; span=(5, 8), match=‘172‘># 内存地址,这是一个正则匹配的结果 print(ret.group()) >>> 172# 通过ret.group()获取真正的结果 ret = re.search(‘\d‘,‘owghabDJLBNdgv‘) print(ret) print(ret.group()) #正则没有匹配到,所以会报错 ret = re.search(‘\d+‘,‘sjkhk3256按实际花费928‘) if ret : # 内存地址,这是一个正则匹配的结果 print(ret.group()) >>> 3256 # 通过ret.group()获取真正的结果
match:从头开始匹配,相当于search中的正则表达式加上一个"^"
ret = re.match(‘\d+‘,‘132sjkhk按156实际花费928‘) print(ret.group()) >>> 132
字符串处理的扩展
split:切割
s = ‘alex83taibai40egon25‘ ret = re.split(‘\d+‘,s) print(ret) >>> [‘alex‘, ‘taibai‘, ‘egon‘, ‘‘] # 以数字切割,切割对象后面默认有一个字符
sub:替换
sub(旧,新,对象,替换次数)
ret = re.sub(‘\d+‘,‘H‘,‘alex83taibai40egon25‘) # 默认全部替换 print(ret) >>> alexHtaibaiHegonH ret = re.sub(‘\d+‘,‘H‘,‘alex83taibai40egon25‘,1) #替换一次 print(ret) >>> alexHtaibai40egon25
subn:也是替换,不过会返回一个元组,元组中第一个原始是替换后的结果,第二个元素是替换的次数
ret = re.subn(‘\d+‘,‘H‘,‘alex83taibai40egon25‘) print(ret) >>> (‘alexHtaibaiHegonH‘, 3)
re模块的进阶
compile:节省使用正则表达式解决问题的时间,将正则表达式编译成字节码,多次使用过程中不会再多次编译,直接拿来用
ret = re.compile(‘\d+‘) # 已经完成编译了 print(ret) >>> re.compile(‘\\d+‘) #编译成原型 res = ret.findall(‘alex83taibai40egon25‘) # 拿来直接用 print(res) >>> [‘83‘, ‘40‘, ‘25‘] res = ret.search(‘sjkhk172按实际花费928‘) #可以多次使用,不用再次编译 print(res.group()) >>> 172
finditer:节省使用正则表达式解决问题的空间,也就是内存
返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值 能够节省内存
ret = re.finditer(‘\d+‘,‘alex83taibai40egon25‘) print(ret) >>><callable_iterator object at 0x000001FE0DEE11D0> #调用/得到迭代器 for i in ret: print(i.group()) >>> 83 40 25
正则表达式的分组在re模块中的使用
#正常使用的正则表达式 s = ‘<a>wahaha</a>‘ # 标签语言 html 网页 ret = re.search(‘(<\w+>)(\w+)(</\w+>)‘,s) print(ret.group()) >>> <a>wahaha</a> # 所有的结果 print(ret.group(1)) >>> <a># 数字参数代表的是取对应分组中的内容 第一个分组中的 print(ret.group(2)) >>> wahaha # 第二个分组中内容 print(ret.group(3)) >>> </a>
不在re模块中的正则表达式有分组
正则表达式的分组在热模块中,为了findall也可以顺利取到分组中的内容,有一个特殊的语法,优先显示分组中的内容
s = ‘<a>wahaha</a>‘ ret = re.findall(‘(\w+)‘,s) print(ret) >>> [‘a‘, ‘wahaha‘, ‘a‘] ret = re.findall(‘>(\w+)<‘,s) #优先寻找匹配括号中的内容 print(ret) >>> [‘wahaha‘]
如果想取消分组优先
形式:(?:正则表达式)
ret = re.findall(‘\d+(\.\d+)‘,‘1.234*4‘) print(ret) >>> [‘.234‘] ret = re.findall(‘\d+(?:\.\d+)‘,‘1.234*4‘) #取消了分组优先 print(ret) >>> [‘1.234‘]
分组命名
形式: (?P<这个组的名字>正则表达式)
对于正则表达式来说 有些时候我们需要进行分组,来整体约束某一组字符出现的次数 (\.[\w]+)?
对于python语言来说 分组可以帮助你更好更精准的找到你真正需要的内容 <(\w+)>(\w+)</(\w+)>
python和正则表达式之间有特殊的约定,要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致
s = ‘<a>wahaha</a>‘ pattern = ‘<(?P<tab>\w+)>(\w+)</(?P=tab)>‘ ret = re.search(pattern,s) print(ret.group()) >>> <a>wahaha</a> #与 正则表达式(<\w+>)(\w+)(</\w+>)效果是一样的 #如果正则表达式中有一模一样的表达式 就可以命名这个表达式,后面就可以直接套用名字
正则表达式使用技巧
#若我们现在想在一个字符串中取出所有的整数,我们是不是这么写 ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") #我们打印看看 print(ret) >>> [‘1‘, ‘2‘, ‘60‘, ‘40‘, ‘35‘, ‘5‘, ‘4‘, ‘3‘] #结果将其中小数分开也匹配上了,跟我们的需求不一样,因为我们是要取整数的,所以,我们要这么写. 原因:你要匹配的内容太没有特点了 容易和你不想匹配的内容混在一起 ret = re.findall(r"\d+\.\d+|\d+","1-2*(60+(-40.35/5)-(-4*3))")#将小数和整数都匹配出来 print(ret) >>> [‘1‘, ‘2‘, ‘60‘, ‘40.35‘, ‘5‘, ‘4‘, ‘3‘] 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‘]
原文地址:https://www.cnblogs.com/--kai/p/9495190.html
时间: 2024-11-06 07:48:17