初学python网络爬虫正则表达式的学习笔记,有不对的地方请批评指正。
正则表达式
\w匹配字母、数字、下划线(普通字符)
\d匹配任意十进制数字
\s匹配空格字符
\W匹配\w相反的字符,除了字母、数字、下划线的其他字符(其他\(大写)都与其小写匹配相反)
元字符:所谓的元字符,就是正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等。(.匹配任意字符;^匹配字符串的开始位置;$匹配字符串结束位置;*匹配0次,1次或者多次的原子,如“s*”能够匹配s、ss、sss…;?匹配0次或者1次;+匹配1次或多次前面的原子;t{n}表示前面的t出现n次才能匹配);s{n,m}表示s原子至少出现n次,至多出现m次;t|s表示t或者s;()表示模式单元
模式修正符:所谓的模式修正符,即可以早不改变正则表达式的情况下,通过模式修正符改变政协二表达式的含义,从而实现一些匹配结果的调整功能。
I不区分大小写;M可进行多行匹配;L本地化识别匹配;U表示根据Unicall字符解析我们的字符;S让我们的点匹配也包括我们的换行符
比如:
>>>pat1='python'
>>>string = 'sdjkdsnskdkfPythondfvjk'
>>>re.search(pat,string)
>>> rst = re.search(pat,string)
>>> print(rst)
None 匹配不了,因为字符串中为大写
>>> rst=re.search(pat1,string,re.I)
>>> print(rst)
<re.Match object; span=(12, 18), match='Python'>这样可以匹配成功,因为I可以修正正则表达式不区分大小写。
贪婪模式与懒惰模式:贪婪模式的核心点就是尽可能多的匹配,而懒惰模式的核心点就是尽可能少的匹配。
例:
>>> import re
>>> pat1='p.*y'#贪婪模式(.表示任意字符,*表示字符可以0,1,。。。多个字符)
>>> pat2 = 'p.*?y'#懒惰模式,?匹配0次或者1次
>>> string = 'abcddjpythondffgpy'
>>> rst=re.search(pat1,string)
>>> print(rst)
<re.Match object; span=(6, 18), match='pythondffgpy'>
>>> #懒惰模式
>>> rst2=re.search(pat2,string)
>>> print(rst2)
<re.Match object; span=(6, 8), match='py'>
懒惰模式匹配到‘py’因为,.匹配任意字符,*匹配0次,1次或者多次原子,而后面的?只匹配0次或者1次,只要找到匹配的(‘py’)就结束了。
正则表达式函数:有re.match()函数、re.reserch()函数、全局匹配函数、re.sub()函数。
re.reserch()函数是在我们的字符串中去搜素一个匹配的字符串;而re.match()函数是从头开始匹配;re.sub()函数用于替换方面。
re.match()函数例:
>>> pat1='p.*y'
>>> string = 'abcddjpythondffgpy'
>>> rst=re.match(pat1,string)
>>> print(rst)
None
#匹配不到,因为match函数从头匹配,字符串开头不是P,直接咔嚓掉
>>> string='pksdhksjrhieyads'
>>> rst=re.match(pat1,string)
>>> print(rst)
<re.Match object; span=(0, 13), match='pksdhksjrhiey'>,这样就能匹配,只能匹配一个结果,不能匹配出两个
比如:
>>> pat1='p.*?y'
>>> string='asdaasdpdkjhfjhfykjdnfkajdfjdfjkpkjdjay'
>>> rst=re.search(pat1,string)
>>> print(rst)
<re.Match object; span=(7, 17), match='pdkjhfjhfy'>只能一个结果
全局匹配函数:
>>> pat1='p.*?y'
>>> string='kasdhfjpjsdabhykjdnkdapkdjhjy'
>>> rst2=re.compile(pat1).finall(string)
>>> rst2=re.compile(pat1).findall(string)
>>> print(rst2)
['pjsdabhy', 'pkdjhjy'] 满足条件都能搜索出来
常见正则实例:匹配.com或.cn网址,
匹配.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']
将https://read.douban.com/provider/all中所有出版社提取出来,存入文件。
>>> import re
>>> import urllib.request
>>> pat='class="name">(.*?)</div>'
>>> data=urllib.request.urlopen("https://read.douban.com/provider/all").read()
>>> data= data.decode('utf-8')
>>> result=re.compile(pat).findall(data)
>>> with open('e:/re.txt','a') as f:
for l in result:
f.write(l+'\n')网络爬虫