zoukankan      html  css  js  c++  java
  • 【python爬虫】正则表达式

    一、数据的分类

      1、结构化数据

        特点:数据以行为单位,每一个数据表示一个实体。每一行数据的属性都是一样的。
        举例:关系型数据库中的表就是结构化数据。
        处理方法:sql

      2、半结构化数据

        特点:结构化数据的另一种形式。他并不符合关系型数据的特点,不能用关系型模型来描述。但是这种数据包含相关标记,有用         来分割语义元素以及字段进行分层的描述。
           因此也被称为自描述结构。
        举例:xml,html,json
        处理方法:正则,xpath,jsonpath,css选择器。

      3、非结构化数据:

        特点:没有固定结构的数据。
        举例:文档、图片、音频、视频。
        处理方法:常常用二进制形式来做整体保存。

    二、json数据

      1、json是什么语言的内容?

        json是js语言中用来用【字符串格式】来保存对象和数组的一种数据结构。
        json数据本质上是字符串。

      2、js种数组和对象

        js的数组:var array = ['aaa','bb','cc']----和python列表对应
        js的对象:var obj = {name:'zhangsan',age:10}---和python字典对应。
            name = obj.name

      3、json数据的解析方法

        json模块:
        (1)对json字符串的操作

          json.loads(json_str)--->python的list或者dict
          json.dumps(python的list或者dict) --->json_str

        (2)对json文件的操作

          json.load(fp)--->从json文件中读出json数据,返回一个python的list或者dict
          json.dump(python的list或者dict,fp)---》python的list或者dict保存到fp所对应的的文件中。

      4、json的意义:

        (1)json作为数据格式进行传输,具有较高的效率
        (2)json不像xml那样具有严格的闭合标签,所以json作为数据传输的时候,他的数据有效占比(有效数据和总数据的比)比xml高很多。
        (3)在相同流量下,json比xml作为数据传输,传输的数据更多。

    三、正则表达式

      1、元字符

        (1)匹配边界

          ^ ----行首
          $-----行尾

        (2)重复次数

          ?----0次或1次
          *----->=0
          +---- >=1
          {n,}--->=n
          {n,m}--->=n,<=m
          {n}----n次

        (3)各种字符的表示

          []----匹配括号中一个字符,单字符
          [abc]--匹配a或者b或者c
          [a-z0-9A-Z]
          d---数字
          w---数字字母下划线
          s---空白字符:换行符、制表符、空格
          ---单词边界
          .----除换行符以外的任意字符。

      2、re模块的使用。

        python中re模块是用来做正则处理的。

        (1)re模块的使用步骤:

    #1、导包
    import re
    #2、将正则表达式编译成一个pattern对象
    pattern = re.complie(
           r'正则表达式',
           '匹配模式'
          )
    # r表示元字符。
    #3、用pattern对象来使用相应的方法来匹配内容。
         

        (2)pattern对象的方法:

          ①match方法:默认从头开始,只匹配一次,返回一个match对象。

    pattern.match(
           '匹配的目标字符串',
            start,匹配开始的位置--缺省,start = 0
            end,匹配结束的位置--缺省,end = -1
            ) # ——>match对象 
              a、match对象的属性
                   match.group()---获取匹配内容。
                match.span()--匹配的范围
                match.start()---开始位置
                match.end()---结束位置
              b、这些方法都可以带一个参数0,但是不能写1,1来表示取分组。
                match.group(0)---获取匹配内容。
                match.span(0)--匹配的范围
                match.start(0)---开始位置
                match.end(0)---结束位置
                match.groups()--将所有分组的内容,按顺序放到一个元组中返回

           ②search方法:从任意位置开始匹配,只匹配一次,返回一个match对象

    pattern.search(
        '匹配的目标字符串',
        start,匹配开始的位置--缺省,start = 0
        end,匹配结束的位置--缺省,end = -1# ——>match对象

          ③findall方法:全文匹配,匹配多次,将每次匹配到的结果放到list中返回。

    pattern.findall(
        '匹配的目标字符串',
        start,匹配开始的位置--缺省,start = 0
        end,匹配结束的位置--缺省,end = -1
        ) # ——>list

          ④finditer方法:全文匹配,匹配多次,返回一个迭代器。

    pattern.finditer(
        '匹配的目标字符串',
        start,匹配开始的位置--缺省,start = 0
        end,匹配结束的位置--缺省,end = -1
        ) #——>list  # finditer主要用匹配内容比较多的情况下。

     

     

          ⑤split:切分,按照正则所表示内容进行切分字符串,返回切分后的每个子串

    pattern.split(
        '要切分的字符串''切分字数',默认是全部分。
        ) # ——>list

     

     

          ⑥sub方法:用指定字符串,替换正则表达所匹配到的内容。

    pattern.sub(
        repl,#替换成什么
        content,替换什么
        count,替换次数,默认替换所有
        ) # ——>替换后的字符串

     

     

          repl替换内容可以使函数:
            函数要求:
              a、函数必须有参数,参数就是正则匹配目标字符串所得到的每个match对象。
              b、这个函数必须要有返回值,返回值必须是字符串,这个字符串将来就作为替换的内容。

    #zhangsan:3000,lisi:4000
    #涨工资每个人涨1000
    content = 'zhangsan:3000,lisi:4000'
    p = re.compile(r'd+')
    result = p.sub(add,)

     

          ⑦分组

              分组在正则表达式中使用()来表示的,一个括号就是一个分组。
              分组的作用:
                a、筛选特定内容
                b、可以在同一个表达式中应用前面的分组:
                  1引用第一分组
                c、findall配合分组
    import re
    
    content = '<html><h1>正则表达式</h1></html>'
    p = re.compile(r'<(html)><(h1)>(.*)</2></1>')
    # print(p.search(content).group())
    print(p.findall(content))#[('html', 'h1', '正则表达式')]
     
     

          ⑧贪婪非贪婪模式

              a、贪婪和非贪婪的却别在于匹配内容的多少。
              b、贪婪使用*来控制匹配次数的。正则默认是贪婪。
              c、非贪婪使用?来控制的。
              d、在表示数量控制元字符后面加一个?,此时就表示这个数量控制符取最小值,也就是非贪婪。

          ⑨匹配模式:

            re.S ----.可以匹配换行符
            re.I----忽略大小写。

          ⑩万能正则匹配表达式:.*?(尽可能少匹配任意内容)配合re.S

  • 相关阅读:
    [翻译]ASP.NET MVC 3 开发的20个秘诀(六)[20 Recipes for Programming MVC 3]:找回忘记的密码
    No.9425 [翻译]开发之前设计先行
    [翻译]ASP.NET MVC 3 开发的20个秘诀(五)[20 Recipes for Programming MVC 3]:发送欢迎邮件
    内联(inline)函数与虚函数(virtual)的讨论
    内联函数、模板、头文件杂记(转)
    gdb使用整理
    data structure and algorithm analysis上一点摘录
    lsof by example 例子
    linux core文件机制
    转一篇shared_ptr的小文
  • 原文地址:https://www.cnblogs.com/Tree0108/p/12070785.html
Copyright © 2011-2022 走看看