python爬虫知识点4-常用解析库re正则

江南有丹橘,经冬犹绿林。

岂依地气暖?自有岁寒心。

可以荐嘉客,奈何阻重深。

运命唯所遇,循环不可寻。

徒言树桃李,此木岂无阴?

今天探长和大家一起探讨一个常见的解析库,即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的使用方法,探长希望能够帮助到你!如有任何问题,欢迎与探长联系(在探长交流-->学习交流中可以加探长微信),或者进行留言互动!

茫茫人海中 期待与你相遇 在你我最美丽的时刻

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180520G10BOJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券