python爬虫——正则表达式

Posted mcq1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫——正则表达式相关的知识,希望对你有一定的参考价值。

原子

原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。

常见的原子类型:

  1. 普通字符作为原子
  2. 非打印字符作为原子
  3. 通用字符作为原子
  4. 原子表
#普通字符作为原子
import re
string="iloveyou"
pat="ve"
res=re.search(pat,string)
print(res)

#非打印字符作为原子,如\n \t
string='''hello
world
'''
pat="\n"
res=re.search(pat,string)
print(res)

#通用字符作为原子
'''
\w 字母、数字、下划线
\W 除字母、数字、下划线
\d 十进制
\D 除十进制
\s 空白字符
\S 除空白字符
'''
string='''hello world 123'''
pat="\d\d"
res=re.search(pat,string)
print(res)

#原子表
#[xyz]:从中任意取一个原子
#[^xyz]:除xyz的任意一个字符
string="iloveyou"
pat="i[^love]o"
res=re.search(pat,string)
print(res)

元字符

元字符是正则表达式中具有一些特殊含义的字符,比如重复N此前面的字符等。

  1. ".":除换行符外任意一个字符
  2. “^”:开始位置
  3. “$”:结束位置
  4. “*”:0\1\多次
  5. "?":0\1次
  6. “+”:1\多次
  7. [n]:恰好n次
  8. n,:至少n次
  9. n,m:至少n次,至多m次
  10. |:模式选择符或
  11. ():模式单元

模式修正符

可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

  1. I:匹配时忽略大小写
  2. M:多行匹配
  3. L:本地化识别匹配
  4. U:unicode
  5. S:让.匹配包括换行符

用法:

#模式修正符
string="Python"
pat="pyt"
res=re.search(pat,string,re.I)
print(res)

贪婪模式与懒惰模式

贪婪模式的核心点就是尽可能多的匹配,而懒惰模式是尽可能少的匹配。默认贪婪模式。

懒惰模式要加?

#贪婪模式与懒惰模式
string="poythonyhjskjsa"
pat1="p.*y"#贪婪模式
pat2="p.*?y"#懒惰模式,精准
res1=re.search(pat1,string,re.I)
res2=re.search(pat2,string,re.I)
print(res1)
print(res2)

正则表达式函数

  1. match:从头开始匹配
  2. search:任何位置都可以
  3. 全局匹配函数:re.compile(pat).findall(string)

实例

  1. 匹配.com和.cn网址:

    string="<a href='http://www.baidu.com'>百度首页</a>"
    pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
    res=re.compile(pat).findall(string)
    print(res)
  2. 匹配电话号码:

    string="afawda027-651315641s3dfs152sd"
    pat="\d4-\d7|\d3-\d8"
    res=re.compile(pat).findall(string)
    print(res)

简单爬虫的编写

import urllib.request
data=urllib.request.urlopen("http://edu.csdn.net").read()

提取网页的电话(QQ……)

import urllib.request
import re
data=urllib.request.urlopen("https://edu.csdn.net/huiyiCourse/detail/1041").read().decode("utf-8")
pat="<p> 电话:(\d*?)</p>"
res=re.compile(pat).findall(data)
print(res[0])

爬取豆瓣出版社

import urllib.request
import re
data=urllib.request.urlopen("https://read.douban.com/provider/all").read().decode("utf-8")
pat='<div class="name">(.*?)</div>' #加上圆括号后可以只显示括号里的内容
res=re.compile(pat).findall(data)
with open("出版社","w") as fp:
    for i in range(len(res)):
        print(res[i])
        fp.write(res[i]+'\n')
fp.close()

以上是关于python爬虫——正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python 爬虫-正则表达式

python爬虫正则表达式

python 爬虫 03-正则表达式

python爬虫之正则表达式

Python爬虫_案例:使用正则表达式的爬虫

Python爬虫_案例:使用正则表达式的爬虫