python爬虫之正则表达式

原子

1.原子:正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。
2.常见的原子类型:

  • 普通字符
  • 非打印字符 如\n,\t
  • 通用字符 如\W,\w,\d,\S
  • 原子表 如[xyz]

3.实战:

import re
string = '''123qwe456p
8888'''
patern = "qwe"     
patern1 = "\n"
patern2 = "\d\d"
patern3 = "123[qrt]"
print(re.search(patern,string))
print(re.search(patern1,string))
print(re.search(patern2,string))
print(re.search(patern3,string))

============================= RESTART: F:/re.py =============================
<_sre.SRE_Match object; span=(3, 6), match='qwe'>
<_sre.SRE_Match object; span=(10, 11), match='\n'>
<_sre.SRE_Match object; span=(0, 2), match='12'>
<_sre.SRE_Match object; span=(0, 4), match='123q'>

元字符

元字符:正则表达式中具有一些特殊含义的字符。
实战:

     .  除换行符外任意字符
     ^  开始标记 
     $  结束标记
     *  0/多次
     +  1/多次
     ?  0/1
     {n}   n为数字,恰好n次 
     {n}至少n次 
     {n,m} 至少n,至多m次
      |     模式选择符或
      ()    模式单元 
     ps:正则表达式默认采用贪婪模式,所以像使用+,*等的元字符都是匹配多次

 
    import  re
    string = '''123qweee456p
    8888'''
    patern = "qwe?"
    patern1 = "qwe??"
    print(re.search(patern,string))
    print(re.search(patern1,string))
    
    ============================= RESTART: F:/re.py =============================
    <_sre.SRE_Match object; span=(3, 6), match='qwe'>
    <_sre.SRE_Match object; span=(3, 5), match='qw'>

模式修正符

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

I 匹配时忽略大小写
M 多行匹配
S   让.忽略换行符 
L  本地化识别匹配
U   unicode

import re
string = "Python123"
patern = "pyt?"
rst = re.search(patern,string,re.I)
print(rst)

============================= RESTART: F:\re.py =============================
<_sre.SRE_Match object; span=(0, 3), match='Pyt'>

贪婪模式与懒惰模式

贪婪模式核心点:尽可能多的匹配
懒惰模式核心点:尽可能少的匹配
实战:

贪婪模式与懒惰模式
懒惰限定符
*?    重复0/多次,但尽可能少重复
+?    重复1/多次,但尽可能少重复
??   重复0/1,但尽可能少重复
{n,m}?  重复n到m次,,,,
{n,}?   重复n次以上,,,,


import re
string = "Pythonyt123yt"
p1 = "Py.*?t"
p2 = "Py.+?t"
p3 = "Py.??t"
rst = re.search(p1,string)
rst1 = re.search(p2,string)
rst2 = re.search(p3,string)
print(rst)
print(rst1)
print(rst2)

============================= RESTART: F:\re.py =============================
<_sre.SRE_Match object; span=(0, 3), match='Pyt'>
<_sre.SRE_Match object; span=(0, 8), match='Pythonyt'>
<_sre.SRE_Match object; span=(0, 3), match='Pyt'>

正则表达式函数

re.match()     必须从字符串首开始匹配
re.search()   从字符串任意地方开始匹配
re.compile.findall() 全局匹配函数

import re
string = "PytPonyt123Pyt"
p1 = "P.*?t"
rst = re.compile(p1).findall(string)
print(rst)
============================= RESTART: F:\re.py =============================
['Pyt', 'Ponyt', 'Pyt']

常见正则实例

#匹配url
import re
string = "<a href='http://www.baidu.com'>百度首页</a>'"
p1 = "[a-zA-Z]+://[^\s]*[.com|.cn]"
rst = re.compile(p1).findall(string)
print(rst)
============================= RESTART: F:\re.py =============================
['http://www.baidu.com']

# 匹配国内电话号码
import re
string = "sjsh213-6565656564545sknsjcn1524-65555555555"
p1 = "\d{3}-\d{8}|\d{4}-\{7,8}"
rst = re.compile(p1).findall(string)
print(rst)

============================= RESTART: F:\re.py =============================
['213-65656565', '524-65555555']

简单爬虫的编写

# 出版社信息爬取并写入文件

import urllib.request
import re
data = urllib.request.urlopen("https://read.douban.com/provider/all").read().decode("utf-8")
pat = '<div class="name">(.*?)</div>'
rst = re.compile(pat).findall(data)
print(rst)
============================= RESTART: F:\re.py =============================
['安徽文艺出版社', '博集天卷', '百花洲文艺出版社', '北京阅览文化传播有限公司',
 '博库网', '白马时光', '八光分文化',  '凤凰联动', 'Fiberead', '果麦文化]

#写入文件
fh = open("F:/出版社.txt","w")
for i in range(0,len(rst)):
    fh.write(rst[i]+'\n')
fh.close()

正则表达式测试工具

https://tool.oschina.net/regex/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值