# 根据正则规则从一段内容中查找结果 ret= re.findall('d+','alex123yuan234') print(ret) #['123', '234'] ret= re.findall('d','alex123yuan234') print(ret) #['1', '2', '3', '2', '3', '4'] ret = re.search('d+','alex123yuan234') print(ret) # 结果对象<_sre.SRE_Match object; span=(4, 7), match='123'> print(ret.group()) #123 ret = re.search('d','alex123yuan234') print(ret.group()) # 1 ret = re.search('d+','alexyuan') print(ret) #None print(ret.group()) #没有数字 报错 ret = re.search('d+','alexyuan') if ret: print(ret.group()) ret = re.match('d+','alex123') print(ret) #None print(ret.group()) # 开头没有数字报错 ret = re.match('d+','123alex') print(ret.group()) #123
findall 找所有 返回列表
search 找第一个 返回一个结果集,通过.group取值,如果没有匹配到,返回None,.group报错
match 从头开始找第一个,返回一个结果集,通过.group取值,如果没有匹配到,返回None,.group报错
# match可以被替代么? 可以 ret = re.search('^d+','123alex') #== re.match('d+','123alex') print(ret.group())
# re.sub ret = re.sub('d+','sb','alex84wusir73') # 默认替换所有 print(ret) #alexsbwusirsb ret = re.sub('d','sb','alex84wusir73') print(ret) #alexsbsbwusirsbsb ret = re.sub('d+','sb','alex84wusir73',1) # 写了1表示替换一次 print(ret) #alexsbwusir73 # re.subn() ret = re.subn('d+','sb','alex84wusir73') print(ret) # ('alexsbwusirsb', 2) # re.split() ret = re.split('d+','alex84wusir73yuan') print(ret) #['alex', 'wusir', 'yuan']
#re.compile par = re.compile('d+') print(par) #re.compile('\d+') ret = par.findall('alex84') print(ret) #['84'] ret = par.search('alex38') print(ret.group()) #38 # finditer ret = re.findall('d','alex84alex84alex84alex84alex84alex84alex84alex84'*200) print(ret) ret = re.finditer('d','alex84alex84alex84alex84alex84alex84alex84alex84'*200) for i in ret: print(i.group()) par = re.compile('d+') ret = par.finditer('alex84alex84alex84alex84alex84alex84alex84alex84'*200) for i in ret: print(i.group())
空间 finditer 返回一个迭代器,迭代器里装的都是结果集,需要通过group取值
时间 compile 能够提前编译一个正则表达式,当同一个正则需要被多次使用的时候,可以节省时间
例题: 取出 hahaha wahaha qqxing
<h1>hahaha<h1>
<h2>wahaha<h2>
<title>qqxing< itle>
import re ret = re.findall('>w+<',r'<title>qqxing< itle>') print(ret[0].strip('<>'))
分组在正则表达式中发挥的作用
分组在findall当中默认会优先被显示出来
如果不想优先,那么在分组中添加(?:正则规则)表示取消这个规则的优先显示+
import re ret = re.findall('>(w+)<',r'<title>qqxing< itle>') print(ret) # findall永远优先显示分组中的内容
import re ret = re.findall('www.(?:baidu|oldboy).com',r'www.baidu.com') print(ret) #['www.baidu.com'] ret = re.findall('d+(?:.d+)?',r'1.23+2.34') print(ret) #['1.23', '2.34']
# split和分组,会保留被切掉的在分组中内容
import re ret = re.split('(d+)','alex84wusir73') print(ret) #['alex', '84', 'wusir', '73', '']
import re ret = re.split('d(d)','alex84wusir73') print(ret) #['alex', '4', 'wusir', '3', ''] 只保留分组里面
# search和分组 import re ret = re.search(r'<(w+)>(w+)<\(w+)>',r'<title>qqxing< itle>') print(ret.group(0)) # 不受到分组的影响 <title>qqxing< itle> print(ret.group(1)) #title print(ret.group(2)) #qqxing
在爬虫数据清洗的过程中最常用的正则表达式的操作
并不是把我要的内容的正则写出来
而是把整个页面都用正则描述下来,然后把我需要的内容放在分组里
这样就能够取到我想要的内容了
遇见分组
findall 优先显示分组中的内容
split 保留被切掉的分组内的内容
search 可以通过组的索引取值
取消分组的特殊行为(?:正则)
# 分组命名 import re 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')) # 不受到分组的影响
# 特殊的需求 # 前端语言 html # <h1>wahaha</h2></h1> # par = '<w+>.*?</w+>' import re ret = re.search('<(?P<tag>w+)>.*</(?P=tag)>','<h1>wahaha</h2></h1></h3>') print(ret.group()) par = '<w+>.*?</w+>' import re ret = re.search(r'<(w+)>.*</1>','<h1>wahaha</h2></h1></h3>') print(ret.group()) # import re # 当我们要匹配的内容混在不想匹配的内容中 # 只能把不想要的也匹配出来,然后去掉不想要的就是想要的 ret = re.findall('d+.d+|(d+)','1-2*(60+(-40.35/5)-(-4*3))') ret.remove('') print(ret)