爬虫 学习笔记1

3.正则表达式

  1. 什么是正则表达式
    即进行数据筛选的表达式

  2. 原子
    正则表达式中的基本组成单位,正则表达式至少包括一个原子

import re
pat = "yue"
string = "http://yum.iqianyue.com"
rst1 = re.search(pat,string)
print(rst1)

string1 = 'sdfasdfa'
rst2 = re.search(pat,string1)
print(rst2)

runfile(‘D:/python/anaconda/spyder/workspace/pachong/pachong/test1.py’, wdir=‘D:/python/anaconda/spyder/workspace/pachong/pachong’)
<re.Match object; span=(16, 19), match=‘yue’>
None

rst1 = re.search(pat,string)

在string中搜索pat,结果赋给rst1

也可以用非打印字符作为原子:

pat2 = '\n'
string3 = 'jijijilikji\njiljkj'
rst3 = re.search(pat2,string3)
print(rst3)

<re.Match object; span=(11, 12), match=’\n’>

(‘\w’通用字符,可以匹配任意一个字母,数字或者下划线,如:abc用“\w\w\w”匹配)
(“\d”匹配任意一个十进制数)
(“\s”匹配任意一个空白字符)
(‘\W’匹配任意除了字母数字下划线之外的字符)
(‘\D’匹配任意一个非十进制数)
(“\S”匹配任意一个非空白字符)

pat3 = '\w\dpython\w'
string2 = 'lkjdslk'
rst4 = re.search(pat3,string2)
string4 = 'sadfa10pythonfdsa'
rst5 = re.search(pat3,string4)
print(rst4)
print(rst5)

None
<re.Match object; span=(5, 14), match=‘10pythonf’>

原子表
pyth[jsz]n表示匹配到pythjn,pythsn,pythzn都可以,但是[]中有两个符合,则不符合,如pythjsn是匹配不到的

pat4 = "pyth[jsz]n"
string5 = "zjilsdjpythsnjkdsa"
rst6 = re.search(pat4,string5)
print(rst6)

<re.Match object; span=(7, 13), match=‘pythsn’>

  1. 元字符
    正则表达式中具有特殊含义的字符,如重复前面n次字符
    (‘.’可以匹配任意字符)
pat = ".python..."
string = "jdljspythonjijdalj"
rst = re.search(pat,string)
print(rst)

<re.Match object; span=(4, 14), match=‘spythonjij’>

(‘^’匹配字符串开始的位置)
(‘$’匹配字符串结束的位置)
(‘s*’匹配字符重复0,1,多次)
(‘s?’匹配字符重复0,1次)
(‘s+’匹配重复1,多次)
(‘t{3}’表示t出现了三次,匹配“ttt”)
(‘s{4,7}’表示s出现至少4次,至多7次)
(‘as|ds’表示或匹配,匹配到as或者ds都可以)

pat = 'python|php'
string = 'abcdphp52543pythonsdfjk342'
rst = re.search(pat,string)
print(rst)

<re.Match object; span=(4, 7), match=‘php’>
只匹配到了‘php’没有继续匹配后面的python了,要得到全部结果,要用find all

  1. 模式修正符
    不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,实现一些匹配的调整等功能

修正符I:表达式不区分大小写

pat1 = "python"
pat2 = "python"
string = 'jdlsjfskjPythonsfsdfji'
#一个使用模式修正符,一个不使用
rst1 = re.search(pat1,string)
print(rst1)
rst2 = re.search(pat2,string,re.I)
print(rst2)

None
<re.Match object; span=(9, 15), match=‘Python’>

修正符M:进行多行匹配
修正符L:本地化识别匹配
修正符S:让“.”也能匹配换行符

  1. 贪婪模式,懒惰模式
    贪婪模式的核心点是:尽可能多的匹配
    懒惰模式的核心点是:尽可能少的匹配
#贪婪模式
pat1 = "p.*y"
#懒惰模式
pat2 = "p.*?y"
string = "24pythonfjilshaklpgtrysdf"
rst1 = re.search(pat1,string)
print(rst1)
rst2 = re.search(pat2,string)
print(rst2)

<re.Match object; span=(2, 22), match=‘pythonfjilshaklpgtry’>
贪婪模式下尽可能多地匹配字符,离得最远的p,y之间的都算
<re.Match object; span=(2, 4), match=‘py’>
懒惰模式下尽可能少地匹配字符,只匹配离得最近的p,y

  1. 正则表达函数
    re.match():
pat1 = "p.*y"
string = "24pythonfjilshaklpgtrysdf"
rst3 = re.match(pat1,string)
print(rst3)

None
match()从字符串头开始搜索,第一个字符不是p,直接返回None了如果在string第一个字符加上p的话就可以:

pat1 = "p.*y"
string = "p24pythonfjilshaklpgtrysdf"
rst3 = re.match(pat1,string)
print(rst3)

<re.Match object; span=(0, 23), match=‘p24pythonfjilshaklpgtry’>
re.search():从一段字符串中搜索一段特定的字符,不需要目标字段是从头开始的,可以出现在任何地方,但是有多个字段符合时,只能匹配到一个,如果要匹配到所有的符合的,要用findall():

pat1 = "php|python"
string = "dfsfdphpdsfpythonsdf"
rst = re.compile(pat1).findall(string)
print(rst)

[‘php’, ‘python’]
全局匹配函数
re.sub():用于替换

  1. 常见正则实例
    如何匹配.com .cn的网址
pat = "[a-zA-Z]+://[^\s]*[.com|.cn]"
string = "<a href='http://www.baidu.com>hasghj</a>"
rst = re.compile(pat).findall(string)
print(rst)

[‘http://www.baidu.com’]

  1. 爬虫
    如何爬取豆瓣阅读网上的所有出版社信息
#1导入相关模块
import urllib.request
import re

#2正则表达式
pat1 = '<div class="name">(.*?)</div>'#采用懒惰模式
pat2 = '<div class="works-num">(.*?) 部作品在售</div>'
#()代表匹配之后只输出括号里的内容

#3读取网页信息,需要解码才能得到源代码
url = "https://read.douban.com/provider/all"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  
req = urllib.request.Request(url=url, headers=headers)  
data  = urllib.request.urlopen(req).read()
# 3.0现在的参数更改了,现在读取的是bytes-like的,但参数要求是chart-like的,加了个编码:
data = data.decode('utf-8')
#print(data)

#4进行匹配
rst1 = re.compile(pat1).findall(data)
rst2 = re.compile(pat2).findall(data)
#print(rst1)
#print(rst2)

#5格式整合到.txt文件中
filename = '出版社信息.txt'
file = open(filename,'w')
#print(len(rst1))
for i in range(len(rst1)):
    line = rst1[i] + ',' + rst2[i] + '\n'
#    print(line)
    file.write(line)
file.close()
    
博集天卷,1644
北京邮电大学出版社,0
北京师范大学出版社,0
百花洲文艺出版社,170
百花文艺出版社,0
长江数字,0
重庆大学出版社,256
东方文萃,0
读客图书,0
电子工业出版社,917
当代中国出版社,0
第一财经周刊,0
豆瓣阅读出版计划,24
巴别塔文化,33
凤凰壹力,386
凤凰悦世泓文,253
凤凰联动,375
Fiberead,388
复旦大学出版社,0
凤凰雪漫,0
果壳阅读,0
果麦文化,606
广西师范大学出版社,898
杭州蓝狮子文化创意股份有限公司,351
后浪出版公司,271
华东师范大学出版社,394
华章数媒,2505
汉唐阳光,0
华文时代,0
湖北人民出版社,0
华章同人,6
华夏盛轩,217
海豚出版社,0
虹膜出版,124
化学工业出版社,37
华中科技大学出版社,0
湖北科学技术出版社,0
黑龙江北方文艺出版社,0
华文经典,190
HarperCollins,6833
聚石文华,0
金城出版社,0
简书,0
今古传奇,0
江苏人民出版社,0
九州幻想,0
科幻世界,163
酷威文化,60
理想国,665
漓江出版社,0
联合读创,125
磨铁数盟,1406
宁波出版社,0
南方人物周刊,0
ONE・一个,0
浦睿文化,58
Parkstone,214
Packt Publishing,0
清华大学出版社,1345
青岛出版社,16
《人物》杂志,0
人民文学出版社,1434
人民邮电出版社,2731
儒意欣欣,0
人民东方出版传媒,376
人民文学杂志社,0
上海九久读书人,506
世纪文景,443
四川数字出版传媒有限公司,21
上海译文出版社,1461
时代华文,517
上海雅众文化,55
世纪文睿,0
时代华语,215
商务印书馆,267
生活・读书・新知三联书店,0
上海社会科学院出版社,287
社会科学文献出版社,0
山西春秋电子音像出版社,139
雁北堂,0
陕西人民出版北京分公司,0
《书城》杂志,50
世界图书出版公司北京公司,17
四川文艺出版社,0
上海文艺出版社,0
上海人民出版社,0
上海交通大学出版社,688
斯坦威图书,450
上海人民美术出版社,0
图灵社区,200
Trajectory,4260
武汉大学出版社北京分社,0
万有图书,0
新星出版社,530
新华先锋文化传媒,0
雪球,220
悬疑世界,0
现代出版社,0
西南财经大学出版社,0
新华出版社,0
新华先锋出版科技,947
译林出版社,906
译言・东西文库,17
译言・古登堡计划,482
悦读纪,0
阳光博客,386
悦读名品,213
燕山出版社,0
阅文集团华文天下,695
中信出版社,2526
中国人民大学出版社,1666
中作华文,1029
中国轻工业出版社,120
紫图图书,233
浙版数媒,1829
中央编译出版社,0
知乎,440
中国国家地理图书部,0
浙江摄影出版社,0
中国经济出版社,267
中国青年出版社,59
中国民主法制出版社,307
中国传媒大学出版社,0
中国言实出版社,0
浙江大学出版社,0
湛庐文化,445
浙江文艺出版社,311
中华书局,364
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值