re 模块
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
1 使用python编写的代码(.py文件)
2 已被编译为共享库或DLL的C或C++扩展
3 包好一组模块的包
4 使用C编写并链接到python解释器的内置模块
为何要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用.
模块类型
内置模块 不需要自己安装的,解释器自带的
第三方模块 需要我们自己安装的模块
自定义模块 我们自己写的模块
re 模块功能:
查找:findall 匹配所有每一项都是列表的一个元素.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re s = "fwfwefwe45894668fwfe1313" ret = re.findall("\d+", s) print(ret) >>>>>>>>>>>>>>>>>>>>> ['45894668', '1313']
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re s = "fwfwefwe45894668fwfe1313" ret = re.findall("\d", s) print(ret) >>>>>>>>>>>>>>>>>>>>>>>>>> ['4', '5', '8', '9', '4', '6', '6', '8', '1', '3', '1', '3']
search: 只匹配从左到右第一个,得到的不是直接的结果而是一个变量,通过变量的group方法来获取结果.如果没有匹配到,会返回None,使用group会报错.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re s = "fwfwefwe45894668fwfe1313" ret = re.search("\d+", s) print(ret) # 正则匹配的结果,内存地址 #<re.Match object; span=(8, 16), match='45894668'> print(ret.group()) # 通过ret.group()来获取结果 45894668 只匹配从左到右的第一个 res = re.search("\d+", "quifgfwuigfyf") print(res) # 没有匹配到结果是None print(res.group()) # 执行res.group会报错 >>>>>>>>>>>>>>>>>>>
match :从头开始匹配,相当于search中的正则表达式加一个^.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re ret = re.match("\d+", "16413dwqf") print(ret.group()) >>>>>>>>>>>>>> 164
字符串处理的扩展: 替换 切割
split 切割
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
s = "fwfwefwe45894668fwfe1313" ret = re.split("\d+", s) print(ret) >>>>>>>>>>>>>>>> ['fwfwefwe', 'fwfe', '']
subn:返回一个元组,第二个元素是替换的次数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re s = "fwfwefwe45894668fwfe1313" ret = re.subn("\d", "h", s) print(ret) >>>>>>>>>>>>>>>>>>>>>> ('fwfwefwehhhhhhhhfwfehhhh', 12)
re模块的进阶:
compile 节省你使用正则表达式解决问题的时间
finditer 节省你使用正则表达式解决问题的空间/内存
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re ret = re.finditer("\d+", s) print(ret) # 返回的是一个迭代器,所有匹配的结果都在这个里面,通过for循环加group的形式取值 for i in ret: print(i.group()) >>>>>>>>>>>>>> <callable_iterator object at 0x000000000241B710> 45894668 1313
findall 返回列表 找所有的匹配项
search 匹配就 返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group会报错
match 相当于search的正则表达式中加了一个'^'
spilt 返回列表,按照正则规则切割,默认匹配到的内容会被切掉
sub/subn 替换,按照正则规则去寻找要被替换掉的内容,subn返回元组,第二个值是替换的次数
compile 编译一个正则表达式,用这个结果去search match findall finditer 能够节省时间
finditer 返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值 能够节省内存
分组在re中的使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import re s = '<a>wahaha</a>' # 标签语言.网页.HTML ret = re.search("<(\w+)>(\w+)</(\w+)>", s) print(ret.group()) #所有结果 print(ret.group(1)) # 数字参数代表的是取对应分组中的内容 print(ret.group(2)) print(ret.group(3)) >>>>>>>>>>>>>>>>>>> <a>wahaha</a> a wahaha a
为了findall也可以顺利取到分组中的内容,有一个特殊的语法,就是优先显示分组中的内容