python爬虫——正则表达式
Posted mcq1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫——正则表达式相关的知识,希望对你有一定的参考价值。
原子
原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。
常见的原子类型:
- 普通字符作为原子
- 非打印字符作为原子
- 通用字符作为原子
- 原子表
#普通字符作为原子
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此前面的字符等。
- ".":除换行符外任意一个字符
- “^”:开始位置
- “$”:结束位置
- “*”:0\1\多次
- "?":0\1次
- “+”:1\多次
- [n]:恰好n次
- n,:至少n次
- n,m:至少n次,至多m次
- |:模式选择符或
- ():模式单元
模式修正符
可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。
- I:匹配时忽略大小写
- M:多行匹配
- L:本地化识别匹配
- U:unicode
- 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)
正则表达式函数
- match:从头开始匹配
- search:任何位置都可以
- 全局匹配函数:re.compile(pat).findall(string)
实例
匹配.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)
匹配电话号码:
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爬虫——正则表达式的主要内容,如果未能解决你的问题,请参考以下文章