re模块
import re
根据正则规则从一段内容中查找结果
findall
从字符串中选出所有能匹配正则表达式规则的内容,以列表的形式返回
ret = re.findall('d+','alex123yuan234')
print(ret)
search
在字符串内查找匹配,只找到第一个匹配并返回信息,返回的是一个结果集,要通过group取值,如果没有匹配到内容,则返回None,group取值会报错,所以一般不直接打印ret
ret = re.search('d+','alex123yuan234')
if ret:
print(ret.group())
match
作用和search一样,不过只在字符串开始处匹配。在search里的正则规则前加一个 ^ search的功能就和match一样了
替换
sub
ret = re.sub('d+','sb','alex84wusir73') # 默认替换所有
ret = re.sub('d+','sb','alex84wusir73',1) # 写了1表示替换一次
print(ret)
subn
ret = re.subn('d+','sb','alex84wusir73')
print(ret) # ('alexsbwusirsb', 2) 返回的是元组,表示替换了两次
split
ret = re.split('d+','alex84wusir73yuan')
print(ret) 按照正则规则切割字符串
参数说明
参数 正则表达式 待匹配的字符串
替换 正则 要换的结果 待匹配的字符串
空间方面操作
finditer
ret = re.finditer('d+','alex84'*200) 返回一个迭代器,内容是结果集
for i in ret:
print(i.group()) 用group从结果集取值
时间操作方面
compile
对于一个经常被重复使用的正则表达式
我们可以先进行一次编译
之后只要用到这个表达式就可以直接拿出来用
这样节省了代码的'时间'
par = re.compile('d+')
ret = par.findall('alex84')
print(ret)
分组在正则表达式中发挥的作用
findall和分组
分组在findall当中默认会优先被显示出来
ret = re.findall('>(w+)<',r'<title>qqxing< itle>')
print(ret)
如果不想优先,那么在分组中添加(?:正规规则) 表示取消这个规则的优先显示
ret = re.findall('d+(?:.d+)?',r'1.23+2.34')
print(ret)
split和分组
会保留被切掉的在分组中的内容
search和分组
ret = re.search(r'<(w+)>(w+)<\(w+)>',r'<title>qqxing< itle>')
print(ret.group(0)) # 不受到分组的影响
print(ret.group(1))
print(ret.group(2)) 可以通过索引取值
在爬虫数据清洗的过程中最常用的正则表达式的操作
并不是把我要的内容的正则写出来
而是把整个页面都用正则描述下来,然后把需要的内容放在分组里
这样就能够取到想要的内容了
分组命名
ret = re.search(r'<(?P<tab1>w+)>(?P<content>w+)<\(w+)>',r'<title>qqxing< itle>') print(ret.group(0)) # 不受到分组的影响 print(ret.group('tab1')) # 不受到分组的影响 print(ret.group('content')) # 不受到分组的影响
(?P<名字>分组内容) 给分组命名
print(ret.group('名字') 查看内容
使用正则解决问题的两种方式
当我们想匹配的内容混在不想匹配的内容中
只能把不要的也匹配出来 然后去掉不想要的 剩下的就是我们需要的
把整个结构描述下来 对想要的进行分组
ret = re.findall('d+.d+|(d+)','1-2*(60+(-40.35/5)-(-4*3))')
ret.remove('')
print(ret)