python网络爬虫正则表达式

初学python网络爬虫正则表达式的学习笔记,有不对的地方请批评指正。

正则表达式

\w匹配字母、数字、下划线(普通字符)

\d匹配任意十进制数字

\s匹配空格字符

\W匹配\w相反的字符,除了字母、数字、下划线的其他字符(其他\(大写)都与其小写匹配相反)

元字符:所谓的元字符,就是正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等。(.匹配任意字符;^匹配字符串的开始位置;$匹配字符串结束位置;*匹配0次,1次或者多次的原子,如“s*”能够匹配ssssss…?匹配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'#贪婪模式(.表示任意字符,*表示字符可以01,。。。多个字符)

>>> 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')网络爬虫

猜你喜欢

转载自blog.csdn.net/xx20cw/article/details/84144536