re模块:
基础方法:
查找:
*****findall:(从大段内容中找到想要匹配的内容) 有三个参数:正则表达式,待匹配的字符串,flag
匹配所有,每一项都是列表中的一个元素
*****search:(表单验证) 只匹配从左到右的第一个,得到的不是一个直接的结果,而是一个变量,
返回的是内存地址,是一个正则匹配的结果
使用.group()获取匹配到的第一个结果,如果没有匹配到,会返回None,再使用group会报错
match: (验证手机号)从头开始匹配,相当于search中的正则表达式加上一个^
字符串处理的扩展: 替换,切割
split: 切割,用正则表达式切,返回列表,默认匹配到的内容会被切掉
sub: 替换,三个参数:旧的,新的,准备替换的字符串,替换次数
subn: 替换,替换后会返回一个元组,里面是替换后的内容和替换次数
re模块的进阶: 时间/空间
*****compile: 节省时间
把正则表达式编译成字节码,在多次使用过程中,不会多次编译
ret = re.compile('\d+')
如果还想再次需要用到这个表达式的时候,直接使用ret.想使用的方法就可以了
*****finditer: 节省空间
两个参数,第一个参数是正则表达式,第二个参数是待匹配的字符串
返回的是一个迭代器,是可迭代的,可以用for循环,但是得到的是一个内存地址,要通过.group()获取每个值
在python中使用正则表达式的特点和问题:
分组在re模块中的使用
findall:为了findall也可以顺利取到分组中的内容,会优先显示分组里面的内容
如果想取消分组优先的话,要在括号里面加?: 例如:(?:表达式)
关于分组:
对于正则表达式来说,有些时候我们需要进行分组,来整体约束某一组字符出现的次数
对于python语言来说,分组可以帮助你更好更精准的找到你真正需要的内容
split: 如果把正则表达式用括号括起来,那么结果会把切掉的东西也返回
分组命名: (?P<名字>表达式),可以直接用名字来取值
匹配标签语法:
使用前面的分组,要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致
s = '<a>wahaha</a>'
pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
ret = re.search(pattern,s)
print(ret)
使用正则表达式的技巧:
练习题
爬虫例子