re模块

# 根据正则规则从一段内容中查找结果
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<\title>

import re
ret = re.findall('>\w+<',r'<title>qqxing<\title>')
print(ret[0].strip('<>'))

分组在正则表达式中发挥的作用

   分组在findall当中默认会优先被显示出来

   如果不想优先,那么在分组中添加(?:正则规则)表示取消这个规则的优先显示+

import re
ret = re.findall('>(\w+)<',r'<title>qqxing<\title>')
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<\title>')
print(ret.group(0))  # 不受到分组的影响  <title>qqxing<\title>
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<\title>')
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)

 

posted @ 2019-03-22 16:18  Xiao_Xu  阅读(185)  评论(0编辑  收藏  举报