廖雪峰爬虫第五节(正则)

贪婪与非贪婪

import re
# 贪婪模式  从开头匹配到结尾 默认
# 非贪婪
one = 'mdfsdsfffdsn12345656n'
two = "a\d"
# pattern = re.compile('a\d')
pattern = re.compile('m(.*?)n')#非贪婪 dfsdsfffds
pattern = re.compile('m(.*)n')#贪婪 dfsdsfffdsn12345656
result = pattern.findall(one)
print(result)

除了 换行符号\n 之外的 匹配

import re
# . 除了 换行符号\n 之外的 匹配
one = """
    msfdsdffdsdfsn
    1234567778888N
"""
pattern = re.compile('m(.*)n', re.S | re.I)
result = pattern.findall(one)
print(result)

纯数字的正则

import re


# 纯数字的正则 \d 0-9之间的一个数
pattern = re.compile('^\d+$')
one = '234'

# 匹配判断的方法
# match 方法 是否匹配成功 从头开始 匹配一次
result = pattern.match(one)

print(result.group())#必须调用group()

范围运算

import re
# 范围运算 [123] [1-9]
one = '7893452'
pattern = re.compile('[1-9]')
result = pattern.findall(one)
print(result)#返回列表
#['7', '8', '9', '3', '4', '5', '2']

常用匹配函数

import re

one = 'abc 123'
patter = re.compile('\d+')

# match 从头匹配 匹配一次
result = patter.match(one)
print(result) #None

# search 从任意位置 , 匹配一次
result = patter.search(one)
print(result.group()) #123

# findall  查找符合正则的 内容 -- list
result = patter.findall(one)
print(result) #['123']

# sub  替换字符串
result = patter.sub('#',one)
print(result) # abc #

# split  拆分
patter = re.compile(' ')
result = patter.split(one)
print(result) #['abc', '123']

匹配中文

import re
# 2.匹配中文
two = '<a href="https://www.baidu.com/" nslog="normal" nslog-type="10600112" data-href="https://www.baidu.com/s?ie=utf-8&amp;fr=bks0000&amp;wd=">网页是最新版本的,适配移动端</a>'

# python中 匹配中问 [a-z] unicode的范围 * + ?
pattern = re.compile('[\u4e00-\u9fa5]+')

result = pattern.findall(two)
print(result)

值得一看!!!

import re
string="taoyunjiaoyu"
#普通字符作为原子
pat="yun"
#正则表达式函数
rst=re.search(pat,string)
print(rst)
#非打印字符作为原子
#\n 换行符  \t   制表符
string='''taoyunjiaoyubaidu'''
pat="\n"
rst=re.search(pat,string)
print(rst)

#通用字符作为原子
'''
\w 字母、数字、下划线
\W 除字母、数字、下划线
\d 十进制数字
\D 除十进制数字
\s 空白字符
\S 除空白字符
'''
string='''taoyunji8 7362387aoyubaidu'''
pat="\w\d\s\d\d"
rst=re.search(pat,string)
print(rst)
#原子表
string='''taoyunji87362387aoyubaidu'''
pat="tao[y]un"
pat="tao[^abc]"
rst=re.search(pat,string)
print(rst)

#元字符
'''
. 除换行外任意一个字符
^ 开始位置
$ 结束位置
* 0\1\多次 
? 0\1次
+ 1\多次
{n} 恰好n次
{n,} 至少n次
{n,m} 至少n,至多m次 
| 模式选择符或
() 模式单元
'''
string='''taoyunnnnji87362387aoyubaidu'''
pat="tao..."
pat="^ao..."
pat="bai..$"
pat="tao.*"
pat="taoyun+"
pat="yun{1,2}"

rst=re.search(pat,string)
print(rst)

#模式修正符
'''
I 匹配时忽略大小写*
M 多行匹配*
L 本地化识别匹配
U unicode
S 让.匹配包括换行符*
'''
string="Python"
pat="pyt"
rst=re.search(pat,string,re.I)
print(rst)

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

#正则表达式函数
#1、match
string="poythonyhjskjsa"
pat="p.*?y"#懒惰模式,精准
rst=re.match(pat,string,re.I)
print(rst)
#2、search 已讲
#3、全局匹配函数
string="hgpoythpnyhjsptjhgjykjsa"
pat="p.*?y"#懒惰模式,精准
#全局匹配格式re.compile(正则表达式).findall(数据)
rst=re.compile(pat).findall(string)
print(rst)

#实例:匹配.com和.cn网址
string="<a href='ftp://www.iqianyue.com'>百度首页</a>'"
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
rst=re.compile(pat).findall(string)
print(rst)
#实例:匹配电话号码
string="jsghajsdhk021-8928874997678328jhdjskgjkh0773-776257672360kjcxdhkj"
pat="\d{4}-\d{7}|\d{3}-\d{8}"
rst=re.compile(pat).findall(string)
print(rst)



#简单爬虫的编写
import urllib.request
data=urllib.request.urlopen("http://edu.csdn.net").read()

#自动提取课程页面的QQ群
import urllib.request
import re
data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/253").read().decode("utf-8")
pat="<em>QQ:(\d*?)</em>"
rst=re.compile(pat).findall(data)
print(rst[0])

用正则搜索网站信息

import re
import requests

url = 'http://news.baidu.com/'
headers = {
    "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}

# response.text 不太准确 转码 是靠推测
data = requests.get(url, headers=headers).content.decode('utf-8')

# 正则解析 数据
#  每个新闻的titile, url

# <a href="http://news.cnr.cn/native/gd/20181028/t20181028_524397644.shtml" target="_blank" mon="r=1">中芯国际回归科创板</a>

pattern = re.compile('<a href="(.*?)" target="_blank" mon="(.*?)">(.*?)</a>')
# pattern = re.compile('<a (.*?)</a>',re.S)

result = pattern.findall(data)

print(result)

with open('02news.html', 'w',encoding='utf-8') as f:
    f.write(data)

知识小结

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值