re 模块

 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

   但其实import加载的模块分为四个通用类别: 

  1 使用python编写的代码(.py文件)

  2 已被编译为共享库或DLL的C或C++扩展

  3 包好一组模块的包

  4 使用C编写并链接到python解释器的内置模块

为何要使用模块?

   如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

    随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用.

模块类型

内置模块 不需要自己安装的,解释器自带的

第三方模块 需要我们自己安装的模块

自定义模块 我们自己写的模块

re 模块功能:

查找:findall 匹配所有每一项都是列表的一个元素.

import  re
s = "fwfwefwe45894668fwfe1313"
ret = re.findall("\d+", s)
print(ret)
>>>>>>>>>>>>>>>>>>>>>
['45894668', '1313']
findall方法
import  re
s = "fwfwefwe45894668fwfe1313"
ret = re.findall("\d", s)
print(ret)
>>>>>>>>>>>>>>>>>>>>>>>>>>
['4', '5', '8', '9', '4', '6', '6', '8', '1', '3', '1', '3']
findall 方法
search: 只匹配从左到右第一个,得到的不是直接的结果而是一个变量,通过变量的group方法来获取结果.如果没有匹配到,会返回None,使用group会报错.
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会报错
>>>>>>>>>>>>>>>>>>>
search()方法
match :从头开始匹配,相当于search中的正则表达式加一个^.
import re
ret = re.match("\d+", "16413dwqf")
print(ret.group())
>>>>>>>>>>>>>>
164
match()方法

字符串处理的扩展: 替换 切割

split 切割

s = "fwfwefwe45894668fwfe1313"
ret = re.split("\d+", s)
print(ret)
>>>>>>>>>>>>>>>>
['fwfwefwe', 'fwfe', '']
split()
subn:返回一个元组,第二个元素是替换的次数
import re
s = "fwfwefwe45894668fwfe1313"
ret = re.subn("\d", "h", s)
print(ret)
>>>>>>>>>>>>>>>>>>>>>>
('fwfwefwehhhhhhhhfwfehhhh', 12)
subn()

re模块的进阶: 

compile 节省你使用正则表达式解决问题的时间
finditer 节省你使用正则表达式解决问题的空间/内存
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
finditer()
findall 返回列表 找所有的匹配项
search 匹配就 返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group会报错
match 相当于search的正则表达式中加了一个'^'

spilt 返回列表,按照正则规则切割,默认匹配到的内容会被切掉
sub/subn 替换,按照正则规则去寻找要被替换掉的内容,subn返回元组,第二个值是替换的次数

compile 编译一个正则表达式,用这个结果去search match findall finditer 能够节省时间
finditer 返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值 能够节省内存
分组在re中的使用:
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
View Code
为了findall也可以顺利取到分组中的内容,有一个特殊的语法,就是优先显示分组中的内容

 


posted on 2018-08-17 16:47  yw1229  阅读(170)  评论(0编辑  收藏  举报

导航