江南有丹橘,经冬犹绿林。
岂依地气暖?自有岁寒心。
可以荐嘉客,奈何阻重深。
运命唯所遇,循环不可寻。
徒言树桃李,此木岂无阴?
今天探长和大家一起探讨一个常见的解析库,即re正则库,探长将从什么是正则、正则表达语法以及正则解析函数等几个方面进行分析。
Part 1 - re是什么?
re是正则表达式(规则表达式)的简称,又被称为regex/regexp,是regular expression的简称。re是计算机科学中的一个概念,是对字符串/文本进行操作的一种逻辑公式,即用事先定义好的特定字符以及这些字符的特定组合,组合成一个“规则字符串”,通过这个“规则字符串”表达对字符串/文本的过滤逻辑,从而得到我们想要的数据结果。
re是一种通用的规则表达,为了使用方便,python内置了re模块,我们可以通过import re语法在python中进行调用。
Part 2 - 正则表达语法
探长把正则表达语法分为两大主要部分:字符表达语法、数量表达语法,其中字符表达语法用来声明特定字符或符号,数量表达语法用来声明匹配的字符或符号的数量。
2.1 字符表达语法
2.2 数量表达语法
2.3 其他表示式
Part 3 - 正则解析函数
3.1 re.match()
re.match()为正则的匹配函数,re.match(pattern, string, flags=0),其中pattern为匹配规则,string为原始文本,flags为可选参数,为匹配模式(例如re.S模式赋予.(点号)换行规则,即包括换行符在内的任意字符);
re.match()仅能从string的首字母进行匹配,不能从中间匹配,同时仅能返回匹配规则的第一个匹配结果,具有一定局限性。
importre
contents ='hello, my phone number is 123456789.'
# re.match匹配数字
#错误的表达方法-没有从字符串的首字母匹配
result = re.match('(\d+)',contents)
print(result.group(1))
#正确的表达方法
result = re.match('hello.*?(\d+)',contents)
print(result.group(1))
3.2 re.search()
re.search()为正则的匹配函数,re.search(pattern, string, flags=0),其中pattern为匹配规则,string为原始文本,flags为可选参数,为匹配模式(例如re.S模式赋予.(点号)换行规则,即包括换行符在内的任意字符);
re.search()弥补了match方法仅能从首字母进行匹配的缺陷,search方法可以从文本任意位置进行查询匹配,但同样仅能返回匹配规则的第一个匹配结果。
# re.search()
# re.search()不用从首字母开始匹配
result = re.search('(\d+)',contents)
print(result.group(1))
注意:re.match()、re.search()均只能返回第一个匹配的结果,不能匹配所有符合条件的数据,因此具有一定局限性,如果想要实现多匹配,此时就需要使用findall方法。
3.3 re.findall()
re.findall()为正则的匹配函数,re.findall(pattern, string, flags=0),用于返回所有符合匹配的结果,其中pattern为匹配规则,string为原始文本,flags为匹配模式(例如re.S模式赋予.(点号)换行规则,即包括换行符在内的任意字符);
re.findall方法弥补了match/search方法的缺陷,可以返回匹配规则的所有结果。
# re.findall()
contents ='hello 001, I am 002'
result = re.findall('(\d+)',contents)
print(result)
# 以列表形式返回所欲结果['001', '002']
3.4 re.sub()
re.sub是正则的替换方法,re.sub(pattern, repl, string),其中pattern为被替换字符的查找规则,repl为替换字符,string为原始文本。
# re.sub()
contents ='hello 001, I am 数据小兵'
result = re.sub('(\d+)','黄象探长',contents)
print(result)
# 返回的结果为'hello 黄象探长, I am 数据小兵'
3.5 re.compile()
re.compile是正则的编译方法,re.compile(pattern, flags=0),把匹配规则编译为匹配规则对象,方便随时多次调用,其中pattern为匹配规则,flags为匹配模式,为可选参数。
# re.compile()
contents ='hello 001, I am 002'
patterns = re.compile('\d+')
result = re.findall(patterns,contents)
print(result)
# 返回的结果同样为列表形式的['001', '002']
3.6 匹配规则-re.S
# 匹配规则
# 错误表达方法-没有使用re.S匹配模式
contents ='''hello my phone number is 1234
5678, please call me'''
result = re.search('is (.*?),',contents)
print(result.group(1))
# 出现异常,不能返回正确结果
# 正确的表达方法
result = re.search('is (.*?),',contents,re.S)
print(result.group(1))
# 返回正确匹配结果'1234\n5678'
Part 4 - 小案例
# 小案例-猫眼热门电影
importrequests
importre
url ='http://maoyan.com/board'
headers = {'User-Agent':'Mozilla/5.0 (Windows '+
'NT 6.3; Win64; x64) AppleWebKit/'+
'537.36 (KHTML, like Gecko) Chrome/'+
'66.0.3359.181 Safari/537.36'}
# 定义网页请求,获取网页内容
defget_html(ulr):
response = requests.get(url,headers=headers)
response.encoding ='utf-8'
html = response.text
returnhtml
# 定义解析过程,获取想要的数据
defparse_html(content):
patterns = re.compile('class="board-index.*?>(.*?)'+
'.*?
.*?data-val.*?>(.*?)'+
'.*?
(.*?)
.*?
'"releasetime">(.*?)
.*?class="integer">'+
'(.*?).*?fraction">(.*?)',re.S)
result = re.findall(patterns,content)
foriteminresult:
yield{
'rank': item[],
'name': item[1],
'actor': item[2].strip().split('主演:')[1],
'releasetime': item[3].strip().split(':')[1],
'score': item[4] + item[5]
}
if__name__ =='__main__':
html = get_html(url)
result = parse_html(html)
foriteminresult:
print(item)
运行上述程序可以得到爬取数据的结果,如下所示:
以上就是常用解析库re的使用方法,探长希望能够帮助到你!如有任何问题,欢迎与探长联系(在探长交流-->学习交流中可以加探长微信),或者进行留言互动!
茫茫人海中 期待与你相遇 在你我最美丽的时刻
领取专属 10元无门槛券
私享最新 技术干货