day17 python
 
一.re模块
    1.re模块的基础方法
        查找findall()
import re
#re.findall(pattern,string,flags=0)
rst = re.findall('\d', 'bajie123ai456')     #找到符合正则的所有结果, 返回列表
print(rst)
>>>['1', '2', '3', '4', '5', '6'
        
        查找search()
import re
#re.search(pattern,string,flags=0)
rst = re.search('\d', 'bajie123ai456')      #只匹配从左到右的第一个; 有的话返回一个'正则匹配的对象', 没有匹配到返回 None, 
print(rst)
>>><_sre.SRE_Match object; span=(5, 6), match='1'>
 
if ret:                                     #如果ret是None, 没有group()方法会报错
    print(rst.group())                      #通过对象的group()方法, 得到匹配的值, match=1
        
        查找match()
import re
#re.match(pattern,string,flags=0)
rst = re.match('\d', '66bajie123ai456')     #match()就是search()的pattern的开始加个^ :只从开头匹配一个
print(rst)
print(rst.group())
        
        split()
import re
s = 'bajie66wukong120'
#re.split(pattern,string,maxsplit=0,flags=0)
print(re.split('\d+',s))                   #和字符串的split()一样, 但是可以按正则切, 也是返回列表
        
        sub()
import re
#re.sub(pattern,repl,string,count=0,flags=0)   
s = 'bajie66wukong120'
rst=re.sub('\d','---',s)                   #和字符串的replace()一样, 但是可以按正则替换, 返回新的字符串
print(rst)
        
        subn()
import re
#re.subn(pattern,repl,string,count=0,flags=0)
s = 'bajie66wukong120'
rst=re.subn('\d','---',s,1)    #和sub()一样, 但是会多返回一个n: 是替换的次数, 返回元组
print(rst)
    
    2.re模块的进阶
        compile() 节省你使用正则表达式解决问题的时间
            如果一个正则很复杂,用户多,执行多次时,耗时多; 先把正则编译, 在多次使用时可反复调用编译对象
import re
#re.compile(pattern,flags=0)
rst = re.compile('\d')          #编译后, 得到一个编译对象; 之后的这个对象有的方法, 和re的一样
print(rst.findall('bajie66wukong120'))  #可多次使用编译的成果
print(rst.findall('asdsaf3243242dsfsa'))
print(rst.findall('hku876j'))
        
        finditer() 节省你使用正则表达式解决问题的空间
import re
#re.findall(pattern,string,flags=0)
rst = re.finditer('\d', 'asdf1223lj43l42l34klj2lkj2')   #找到所有匹配的结果(findall): 但是返回的不是列表, 返回的是包含有匹配对象的迭代器
print(rst)
for el in rst:
    print(el.group())
    
    3.在python中使用正则表达式的特点和问题
        在正则中的应用: ()内的组成一个整体
        分组在re模块中的使用: "反向引用"
            search()中, 正常的分组显示;     match()和这个一样, 注意是 ^pattern就行了
import re
 
s = '<a>bajieaishuishui</a>'                    #这个是标签语言, a标签, html语言中的, web网页
 
rst = re.search('<(\w+)>(\w+)</(\w+)>', s)      #首先分组不会对正则有影响,
print(rst.group())                              #默认0, 是取所有匹配的,
print(rst.group(1))                             #分组中的应用是从 1 开始的
print(rst.group(2))
print(rst.group(3))
            
            findall()中的分组优先显示, 和取消分组优先显示
import re
s = '<a>bajieaishuishui</a>'
print(re.findall('>(\w+)<',s))                      #['bajieaishuishui']   #findall 的分组时的优先显示特性(是由于没有类似search的group方法, 所以想了一个这样的招)
 
print(re.findall('\d+(\.\d+)?', '1.234*4.56'))      #['.234', '.56']   #由于findall的分组优先特性, 我想要的小数得不到了, 怎么办?
 
print(re.findall('\d+(?:\.\d+)?', '1.234*4.56'))    #['1.234', '4.56']  #在分组的内部前面加上 (?:pattern), ?:和正则无关, 是python和正则之间的恩怨
            
            split()中的分组, 留下刀
import re
s = 'bajie66wukong120'
#re.split(pattern,string,maxsplit=0,flags)
print(re.split('(\d+)',s))        #['bajie', '66', 'wukong', '120', '']  #会把刀留下
            
            分组命名
import re
s = '<a>bajieaishuishui</a>'
rst = re.search('<(?P<hao>\w+)>(?P<shen>\w+)</(?P<qi>\w+)>', s)     #怎么命名: 在分组里面的开始位置加上(?P<name>pattern)
print(rst.group('hao'))                                             #如何调用: 把数字换成分组时起的名字group('name'), name 是字符串
print(rst.group('shen'))
            
            分组命名的应用
import re
 
s = '<a>bajieaishuishui</a>'
rst = re.search('<(?P<hao>\w+)>(?P<shen>\w+)</(?P=hao)>', s)    #在正则中前面命名,正则后面直接引用这个名字, 表示的是和前面正则匹配的内容(结果)是一样的
print(rst.group())                                              #如果匹配到就好, 如果匹配不到, 返回None
 
#2018-12-09
#2019.11.9
#2017 09 08     #要求年和月之间的符号, 和月和日之间的符号一样时, 可以用到
            
            上面的也可以用\1\2这样的反向引用
import re
s = '<a>bajieaishuishui</a>'
rst = re.search(r'<(\w+)>(\w+)</\1>', s)       #r'pattern' : 要用 r''把正则搞起来
print(rst.group())
 
    4.使用正则表达式的技巧
        你要匹配的内容太没有特点了, 容易和你不想匹配的内容混在一起
        那么你就把你不想匹配的也匹配出来, 然后想办法去搞掉他
import re
rst = re.findall('\d+', '1-2*(60+(-40.35/5)-(-4*3))')
print(rst)          #['1', '2', '60', '40', '35', '5', '4', '3']    #取整数, 但不想匹配小数
 
rst = re.findall('(\d+\.\d+)|(\d+)', '1-2*(60+(-40.35/5)-(-4*3))')  #如何精准的取到整数, 过滤掉小数
print(rst)          #[('', '1'), ('', '2'), ('', '60'), ('40.35', ''), ('', '5'), ('', '4'), ('', '3')]
rst = re.findall('\d+\.\d+|(\d+)', '1-2*(60+(-40.35/5)-(-4*3))')
print(rst)          #['1', '2', '60', '', '5', '4', '3']
 
    5.爬虫的例子
    预备知识
        如何获取网页url的源代码
import re
from urllib import request
rst = request.urlopen('https://pythonav.com/')    #拿到响应的对象
print(rst.read().decode('utf-8'))                 #对象的 read()方法, 打印出字节码,然后解码成字符串  #这就是这个url在网页上的源代
        
        正则中的 . (点)不匹配\n, python如何让他匹配
import re
s = '''234
'''
print(re.search('23.*56',s, flags=re.S))    #flags=re.S即可解决
    
    简易爬虫
import re
from urllib import request
 
pattern = '<div class="item">.*?<em.*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>.*?<span class="rating_num".*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)</span>'
comp = re.compile(pattern, flags=re.S)
 
def get_page_str(url):
    rst = request.urlopen(url)
    s = rst.read().decode('utf-8')
    return s
 
def handle_page(s):
    for i in comp.finditer(s):
        yield {
            'id': i.group('id'),
            'title': i.group('title'),
            'rating_num': i.group('rating_num'),
            'comment_num': i.group('comment_num')}
def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    s = get_page_str(url)
    rst = handle_page(s)
 
    with open('move_info.txt', 'a', encoding='utf-8') as f:
        for el in rst:
            print(el)
            data = str(el)
            f.write(data+'\n')
 
for num in range(0,251,25):
    main(num)
    
    网页源代码内容(一个电影介绍的源代码实例)
'''
<ol class="grid_view">
        <li>
            <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>
                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>
                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.7</span>
                                <span property="v:best" content="10.0"></span>
                                <span>1575462人评价</span>
                        </div>
                           <p class="quote">
                                <span class="inq">希望让人自由。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>
'''
 
 
二.练习
    1.计算器    
    计算结果: rst = '1 - 2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))- (-4*3)/(16-3*2))'
    要求:
        不能用print(), 不能用eval(), 要自己写算法
        用到函数
        用到循环
        用到re模块
    步骤:
        先把所有的空格去掉
        匹配内层中不再有括号的表达式
            先计算*/, 在然后计算+-
        将括号中计算的结果, 替换刚刚计算的括号
            如何处理符号
        循环这个过程
import re
 
def atom_mul_div(expr):
    if '*' in expr:
        a, b = expr.split('*')
        return str(float(a) * float(b))
    elif '/' in expr:
        a, b = expr.split('/')
        return str(float(a) / float(b))
 
def atom_add_sub(expr):
    lst = re.findall('[+-]?\d+(?:\.\d+)?',expr)
    atom_sum = 0
    for i in lst:
        atom_sum += float(i)
    return atom_sum
 
def atom_format(expr):
    expr = expr.replace('++', '+')
    expr = expr.replace('--', '+')
    expr = expr.replace('+-', '-')
    expr = expr.replace('-+', '-')
    return expr
 
def atom_brackets(expr):
    while True:
        expr_sub = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', expr)
        if expr_sub:
            expr_sub = expr_sub.group()
            rst = atom_mul_div(expr_sub)
            expr = expr.replace(expr_sub,rst)
            expr = atom_format(expr)
        else:
            break
    rst = atom_add_sub(expr)
    return rst
 
def main(expr):
    expr = expr.replace(' ', '')
    while True:
        expr_sub = re.search('\([^()]+\)', expr)
        if expr_sub:
            expr_sub = expr_sub.group()
            rst = atom_brackets(expr_sub)
            expr = expr.replace(expr_sub, str(rst))
            expr = atom_format(expr)
        else:
            break
    return atom_brackets(expr)
 
s = '1 - 2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568.8/14))- (-4*3)/(16-3*2))'
print(main(s))
print(eval(s))
 
 
 
 
 
 

day17 python re模块 简易爬虫的更多相关文章

  1. python简易爬虫来实现自动图片下载

    菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷. 估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择.本人借鉴网上的部分实现 ...

  2. 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块

    feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...

  3. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  4. 爬虫系列1:python简易爬虫分析

    决定写一个小的爬虫系列,本文是第一篇,讲爬虫的基本原理和简易示例. 1.单个网页的简易爬虫 以下爬虫的主要功能是爬取百度贴吧中某一页面的所有图片.代码由主要有两个函数:其中getHtml()通过页面u ...

  5. 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档

    孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...

  6. python 常用模块(转载)

    转载地址:http://codeweblog.com/python-%e5%b8%b8%e7%94%a8%e6%a8%a1%e5%9d%97/ adodb:我们领导推荐的数据库连接组件bsddb3:B ...

  7. python常用模块(1):collections模块和re模块(正则表达式详解)

    从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...

  8. 洗礼灵魂,修炼python(50)--爬虫篇—基础认识

    爬虫 1.什么是爬虫 爬虫就是昆虫一类的其中一个爬行物种,擅长爬行. 哈哈,开玩笑,在编程里,爬虫其实全名叫网络爬虫,网络爬虫,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者 ...

  9. 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10

    孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...

随机推荐

  1. 四-3、Mirror(镜像)、Spin(旋转)、创建组

    1.Mirror 1.针对单个器件 2.针对整个模块 2.Spin(旋转)(平时用的比较少) 3.创建组(经常用到)(主要是在布局时,发现后期需要移动整个模组)(创建为group) 1.创建组---- ...

  2. PHP 最全的正则表达式

    一.校验数字的表达式  1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0 ...

  3. 如何选择Linux操作系统版本?

    一般来讲, 桌面用户首选Ubuntu; 服务器首选RHEL或CentOS, 两者中首选CentOS; 根据具体要求: 1.安全性要求较高, 则选择Debian或者FreeBSD. 2.需要要使用数据库 ...

  4. windown 使用python 自动切换网络

    由于工作环境的特殊性,有时需要切换到内网工作,有时需要通过手机连接外网,想自动运行一个脚本就做完这事 首先在PC机上安装一个无线网卡,例如360wifi就可以. 除了python,还用到了DOS命令, ...

  5. mypwd实现

    实现mypwd 要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 步骤 查看pwd的作用man -k pwd ...

  6. spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)

    本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...

  7. Vue过滤器:全局过滤器

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化. 过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持). 过滤器应该被添加在 JavaScr ...

  8. Python算法每日一题--001--给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  9. 【ABAP系列】SAP ABAP模块-memory内存数据传输的例子

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-memor ...

  10. hdu6575Budget

    Problem Description Avin’s company has many ongoing projects with different budgets. His company rec ...