zoukankan      html  css  js  c++  java
  • 正则表达式学习

    # In[]
    
    # 正则表达式Regx ----  字符串特殊匹配方式 设置格式进行匹配
    import requests
    import re
    import os
    
    text = '''2月份,各地继续落实地方调控主体责任,坚持因城施策,促进房地产市场平稳健康发展。
    据初步测算,4个一线城市新建商品住宅销售价格环比上涨0.3%,涨幅比上月回落0.1个百分点。
    其中:北京下降0.2%,上海和广州分别上涨0.3%和1.1%,深圳持平。
    二手住宅销售价格环比上涨0.15%。其中:北京和深圳分别上涨0.2%和0.5%,上海和广州分别下降0.1%和0.2%。
    31个二线城市新建商品住宅销售价格环比上涨0.7%,涨幅连续三个月相同;
    二手住宅销售价格环比下降20.21%,降幅比上月扩大0.1个百分点。
    35个三线城市新建商品住宅销售价格环比上涨10.4%,涨幅比上月回落0.2个百分点;
    二手住宅销售价格环比上涨0.2%,涨幅与上月相同18%,22.65431%。'''
    
    # 提取出文段中的百分比数
    
    # =============================================================================
    # '''步骤分析:
    # 1. 有共同的特点---  都是以%结尾
    # 2. %前面是数值
    # 3. 数值之前是有.
    # 4. 点之前又是数值的
    # '''
    # =============================================================================
    
    re.findall(r'd+.?d+%',text)
    
    # 观察到其中有整数百分比  还有小数百分比  所以在.之后加?表示小数点有就匹配到,没有就跳过
    # d  表示匹配数值  加号修饰前一个字符 可以重复一次或无限次
    
    
    # 小练习: 提取出上面文段中的某线城市
    
    re.findall(r'.线城市',text)
    re.findall(r'[一二三四五六七八九十]线城市',text)
    re.findall(r'[d.d]*%',text)
    
    
    # 小练习
    s = 'a你好ca如何cxxxa你你ca你何c'
    
    # 提起出其中的‘a你好c’ ‘a如何c’ 
    re.findall(r'(a(你好|如何)c)',s)
    
    
    
    # In[]
    
    text1 = '''西楼尘 看过  2018-07-02
    最费力的成长留在树上的只有壳,最狰狞的伤口留在皮肤的只有疤。最动人的烟火绽在空中看不到,最深沉的感谢飘进风中听不清。你教我食物最美味的吃法,却教我获得食物最羞耻的手法;我学会祈祷最灵验的手势,也学会用来祈祷最不齿的心愿。我在商店里偷换掉童年,你在泥土里掩埋了伤疤,而我们组成了家。
    
    举报
    
    7596 有用 凌睿 看过  2018-08-02
    或是被第三者插足,或是不受父母待见,或是被辞退,或是父母根本不想把Ta生下来……这群被抛弃的人们,却共同组成了最温馨、最和睦、最融洽、最可爱的家庭。 他们或是失业,或是工伤,或是以偷窃维持生计,或是在风俗店工作,他们生活在社会的最底层,他们缺少物质财富,精神生活却无比充实。 他们每个人之间都没有血缘关系,但每个人都比原来的家庭过得更加快乐。 结婚不意味着幸福,被丈夫抛弃也能子孙满堂; 生了孩子不一定就是母亲,没有生育能力也可以给予母爱。 柴田治以为什么都教不了孩子,却教会了他什么叫青春期。 亚纪远离了富有的家庭,因为4号先生的肩膀更让她感到温暖。 由里遭到亲生父母虐待,却有一位素不相识的人愿意以失去工作的代价保护她。 富有富的活法,穷有穷的活法。我们在丰衣足食中颓废度日,他们在贫困交加中感受大爱无疆。
    '''
    # A 表示提取字符串的开头或者结尾
    
    """
    问题: 提取其中的用户名 
    1. 不同的是第一个西楼尘之前没有空格
    2. 所以用到 或与非 以及  首字符的提取
    
    """
    re.findall(r'A(.*) 看过',text1)  # 提取到了开头 
    re.findall(r'有用 (.*) 看过',text1)  # 提取到中间部分
    
    # 将上面那两个很合并  用或连接  |
    re.findall(r'(有用 |A)(.*) 看过',text1)
    
    # 提取其中的日期
    
    re.findall(r'd{4}-d{2}-d{2}',text1)
    re.findall(r'd+-d+-d+',text1)
    
    # In[]
    #v =========================================================================================
    
    ## 爬取网站中的小说(剑来): http://www.shuquge.com/txt/8659/index.html
    
    # 首先获取网页的源代码
    
    import requests 
    import re
    import os
    
    url = 'http://www.shuquge.com/txt/8659/'
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 
               Safari/537.36' }
    
    r = requests.get(url , headers = headers)  # 获取网页的源代码
    r.text
    r.encoding = 'utf-8'  # 发现得到的网页源代码有乱码部分 , 重新赋值编码格式 
    r.text
    
    
    # 使用正则表达式提取网址中需要的  就是随你改变网页变化的部分
    chate_link = re.findall(r'<dd><a href="(.*)".*</a></dd>',r.text)
    
    # 拼接  将固定不变的部分和变换的部分进行拼接
    a = 'http://www.shuquge.com/txt/8659/'
    for i in chate_link:
        print(a + i)
    
    
    
    
    
    
    
    # 把章节列表页代码打包成函数
    #L = []
    def list1(url):
    # =============================================================================
    #    """传入章节列表网址, 提取出对应小说的章节列表"""
    # =============================================================================
        headers ={
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'  
        }
        r = requests.get(url,headers = headers)
        r.encoding = 'utf-8'
        # 使用正则表达式提取网址中需要的  就是随你改变网页变化的部分
        chate_link = re.findall(r'<dd><a href="(.*)".*</a></dd>',r.text)  
        # 进行循环 将得到的
    #    for i in chate_link:
    #        b = url+i
    #        L.append(b)
    #    return L
        return chate_link
    
    url = 'http://www.shuquge.com/txt/8659/'
    list1(url)
        
    # In[]
    # 例如爬去其中一章节的内容
    
    url = 'http://www.shuquge.com/txt/8659/15605645.html'
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 
               Safari/537.36'}
    
    r = requests.get(url , headers = headers)
    
    r.encoding = 'utf-8'
    
    r.text
    
    wenben = re.findall(r'<div id="content" class="showtxt">(.*?)</div>',r.text,re.S)[0]
    # re.S 表示换行抓取 否则无法获取到结果  并且需要改为懒惰模式 、
    # 因为需要的部分在最近的</div>之间   结果为列表 提取出来进行后续的操作
    
    # 删除掉多余的字符   注意其中的换行符 
    <br />  可以改变为 
    
    
    zuizhong = wenben.replace(' ','').replace('
    <br/>','
    ').
    replace('
    <br />','
    ').replace('<br />','').replace('<div id="content"
           class="showtxt">','')
    # 利用正则表达式   提取标题 
    
    title = re.findall(r'<h1>(.*)</h1>',r.text)[0]
    
    
    
    
    # 将得到的文本导出至本地
    
    # open() 函数导入和导出
    
    f = open('剑来.txt','w')  # 在工作路径下创建文件
    
    # 利用open函数写入文件
    
    f.write(title)  # 写入标题
    f.write('
    
    ')   # 加入换行符
    f.write(zuizhong)  # 写入整理好的文件
    
    f.close()  # 关闭写入函数
    
    
    
    
    # 将上面的代码整理为函数形式调用
    
    def  fun2(url):
        
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 
               Safari/537.36'}
    
        r = requests.get(url , headers = headers)
        
        r.encoding = 'utf-8'
        
        
        wenben = re.findall(r'<div id="content" class="showtxt">(.*?)</div>',r.text,re.S)[0]
        # re.S 表示换行抓取 否则无法获取到结果  并且需要改为懒惰模式 、
        # 因为需要的部分在最近的</div>之间   结果为列表 提取出来进行后续的操作
        # 删除掉多余的字符   注意其中的换行符 
    <br />  可以改变为 
    
        
        zuizhong = wenben.replace(' ','').replace('
    <br/>','
    ').
        replace('
    <br />','
    ').replace('<br />','').replace('<div id="content"
               class="showtxt">','')
        
        # 利用正则表达式   提取标题 
        title = re.findall(r'<h1>(.*)</h1>',r.text)[0]
        return title , zuizhong
    
    fun2('http://www.shuquge.com/txt/8659/2324755.html')
    
    
    
    
    # In[]
    
    
    # =============================================================================
    
    # 将上面的代码进行整合  变为一个函数可以一次性爬取该文章的所有章节
    
    # 获取章节
    zhangjie = list1("http://www.shuquge.com/txt/8659/")
    # 创建文件夹
    import os
    if not os.path.exists('剑来'): 
        # 创建名为剑来的文件夹
        # 判断是否存在  如果存在,创建  如果不存在则不返回任何值
        os.mkdir("剑来")
    
    # 对章节列表进行拼接
    url = "http://www.shuquge.com/txt/8659/"
    n = 1
    for i in zhangjie:
        print(url + i)
        a = url + i
        title,zuizhong = fun2(a)
        # 此时有了标题和文章内容  
        # 建立函数 将得到的标题和文章内容 放置文件夹中 并给予文章名
        
        f = open('剑来/'+str(n)+'_'+title+".txt",'w',encoding = 'utf-8')  
        # '剑来/'表示本地文件夹 加上文件名     此时得到的文件名称是无序的 
        # 在文件的前面加上数字进行排序   str(n) 表示狮子不能直接接在字符串上,需转换为字符型
        # 写入内容
        f.write(title)
        f.write('
    
    ')
        f.write(zuizhong)
        n+ = 1  # 表示每一章结束在文件前加的数字上加1  实现自动排序
    

      

  • 相关阅读:
    281. Zigzag Iterator
    298. Binary Tree Longest Consecutive Sequence
    482. License Key Formatting
    361. Bomb Enemy
    373. Find K Pairs with Smallest Sums
    304. Range Sum Query 2D
    308. Range Sum Query 2D
    307. Range Sum Query
    303. Range Sum Query
    247. Segment Tree Query II
  • 原文地址:https://www.cnblogs.com/manjianlei/p/11537527.html
Copyright © 2011-2022 走看看