美文网首页Python网络爬虫与信息提取
(三)正则表达式入门学习笔记|Python网络爬虫与信息提取

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取

作者: 努力奋斗的durian | 来源:发表于2018-01-16 21:46 被阅读71次

    1.正则表达式的概念学习
    2.正则表达式的语法学习
    3.Re库的基本使用
    4.Re库的match对象
    5.Re库的贪婪匹配和最小匹配
    6.单元小结

    网页链接【Python网络爬虫与信息提取】.MOOC. 北京理工大学
    https://www.bilibili.com/video/av9784617/?from=search&seid=16910651407750346491#page=37

    最近更新:2018-01-16

    1.正则表达式的概念学习

    1.1正则表达式概念

    • 设想我们有一组字符串,不是一个字符串,而是一组。表达一组字符串的方式是一一列举出来。但是这种方式既繁琐又占用空间。因此需要一种简单的表达方式。正则表达式就是为了这种方式而诞生的。
    • 而图上的一组字符串,其实可以用一行正则表达式进行表达。如下:


    1.2正则表达式的优势

    • 优势:简洁。可以表达一组很大的字符特征,所以我们叫正则表达式是“一行胜前言”。正是因为此特征,能够将字符串的一组特点表示出来。因此正则表达式也是表达了一组字符串的特征、或模式。

    1.3正则表达式的案例

    • 有一组字符串时以p开头,之后有一个或无穷多个Y。我们想表达这一组字符串,但是有无穷多个,列举不全。那么跟正则表达式等价的又如何表达呢?


    • 用PY+来表示无穷多个以P为开头,但是后面有一个或无穷多个Y的字符串组。所以表示无穷字符串组的时候,正则表达式非常有用。

    • 比如说有一组字符串,有某些特点,以PY开头,后续存在不多于10个字符,后续的字符不能是“P”或“Y”,具体如截图:


    • 以上的要求,其实可以枚举出来,因为是有穷个。但是可以枚举但是繁琐。事实上这是一种有某种特点的字符串。但是我们很难枚举出来。在这种情况下,我们可以用正则表达式表示这种特点。可以用以下的形式表达:



      1.3正则表达式


    • 字符串用简洁的方式表达更多的字符串,或者罗列一些特征,正则表达式就是刚好这样的工具。

    1.4正则表达式在文本处理中十分常用

    • 正则表达式主要应用于字符串的匹配

    1.5正则表达式的使用

    • 用编译,将这个特征是可以表达一组字符串。编译后的一组特征跟一组字符串的特征是对应的。而编译之前的正则表达式符号正则表达式语法的一个单一字符串,但不是真正意义上的表达式。

    2.正则表达式的语法学习

    2.1正则表达式的构成

    • 正则表达式是由字符和操作符构成。

    2.2正则表达式的常用操作符


    2.3正则表达式语法实例

    PY{:3}N,表示将大概号前的字符,扩展0到3次。

    2.4经典正则表达式实例

    2.5匹配IP地址的正则表达式

    • 匹配IP地址的正则表达式,在考虑用以下方式代表IP地址是否适用?
      方法一:不考虑每一段的取值范围和空间,只考虑他们之间出现的. 进行分割。
      方法二:考虑中间每一个字符串,每一个数字出现的范围都是0个,1个或到3个字符串的长度。以此约定每一个点中间的数字。
    • 无论方法一,还是方法二,采用的正则表达式不精确。比如我可以匹配一个300.300.300.300没问题。那能不能设计一个比较精确的IP地址呢?
    • 首先每段用.进行分割,这比较好处理。每.与.之间的取值是0到255。我们可以将它的取值范围再分开,具体如下:


    3.Re库的基本使用

    3.1Re库介绍

    3.2正则表达式的表示类型

    • 第一个例子是国内邮政编码,第二个例子是国内电话号码
    • 原生字符串类型与字符串类型的区别,不同的是字符串表示前加一个小写的字符r。原生字符串类型是不包含转义符的字符串。在python语言中,有一个转义符/,那么原生字符串中的斜杠/不被解释为转义符。当正则表达式包含<转义符>,请使用raw string来表达正则表达式。
      18.jpg

    3.3Re库主要功能函数(这六个函数非常常用)

    3.3.1 re.search函数使用


    • 这个函数是通过一条正则表达式来匹配一条string,同时用一些标记来控制查找。
    • 常用的标记,有三个,如下:


    • 以中国邮政编码为例,如下:
    >>> import re
    >>> match=re.search(r'[1-9]\d{5}','BIT 100081')
    >>> if match:
        print(match.group(0))
    
        
    100081
    >>> 
    

    3.3.2 re.match函数使用



    案例1

    >>> import re
    >>> match=re.match(r'[1-9]\d{5}','BIT 100081')
    >>> if match:
        print(match.group(0))
    
        
    >>> 
    

    结果无匹配值。

    案例2

    >>> import re
    >>> match=re.match(r'[1-9]\d{5}','100081BIT ')
    >>> if match:
        print(match.group(0))
    
        
    100081
    >>> 
    

    结果有匹配值。

    3.3.3 re.findall函数使用

    >>> import re
    >>> ls=re.findall(r'[1-9]\d{5}','BIT100081  TSU100084')
    >>> ls
    ['100081', '100084']
    

    3.3.4 re.split函数使用



    案例1

    >>> import re
    >>> re.split(r'[1-9]\d{5}','BIT100081  TSU100084')
    ['BIT', '  TSU', '']
    

    案例2

    >>> import re
    >>> re.split(r'[1-9]\d{5}','BIT100081  TSU100084',maxsplit=1)
    ['BIT', '  TSU100084']
    

    3.3.5 re.finditer函数使用


    >>> import re
    >>> for m in re.finditer(r'[1-9]\d{5}','BIT100081  TSU100084'):
        if m:
            print(m.group(0))
    
            
    100081
    100084
    

    3.3.6 re.sub函数使用


    >>> import re
    >>> re.sub(r'[1-9]\d{5}',':zipcode','BIT100081  TSU100084')
    'BIT:zipcode  TSU:zipcode'
    >>> 
    

    3.3.7 汇总Re库主要功能函数



    6个函数有3个是match对象。

    3.4 Re库的另外一种等价用法

    • 面向对象用法:将一个正则表达式的字符串编译成为一个正则表达式的类型,叫pat,我们也叫patent类型。然后我们用patent这个对象直接调用search函数,来获得相关结果。这种方法的好处是经过一次编译,当我们多次使用正则表达式使用及匹配时,可以用这种方式加快使用。
    • 介绍re.compile()函数



    4.Re库的match对象

    >>> import re
    >>> match=re.search(r'[1-9]\d{5}','BIT100081')
    >>> if match:
        print(match.group(0))
    
        
    100081
    

    用type函数检查match的类型

    >>> type(match)
    <class '_sre.SRE_Match'>
    

    看到返回的是sre类型。

    4.1 Match对象的属性

    4.2 Match对象的方法

    • 还有group(1),group(2),需要找相关的文档进行阅读。对于一般的正则表达式,group(0)就可以获得匹配的字符串。
    • .span()返回元组类型

    4.3 Match实例介绍

    4.2.1Match对象的属性实例

    >>> import re
    >>> m=re.search(r'[1-9]\d{5}','BIT100081  TSU100084')
    >>> m.string
    'BIT100081  TSU100084'
    >>> m.re
    re.compile('[1-9]\\d{5}')
    

    只有经过compile的才是正则表达式,没有经过compile的正则表达式则是一种表示。

    >>> m.pos
    0
    >>> m.endpos
    20
    

    4.2.2Match对象的方法实例

    >>> m.group(0)
    '100081'
    

    以上,这是返回第一次匹配对象的结果

    >>> m.start()
    3
    >>> m.end()
    9
    >>> m.span()
    (3, 9)
    

    5.Re库的贪婪匹配和最小匹配

    5.1Re库的实例

    • PY.*N表示是以PY开头,以N为结尾。N可以有若干个字符串。
    • 以上截图,字符串存在多项匹配,有4个匹配项,同时匹配的长短也不相同,最短有4个字符,最长是全部字符串。正则表达式会返回最长的结果。如下:
    • 如何输出最短的子串呢?


    5.2最小匹配操作符

    6.单元小结

    6.1Re(正则表达式)入门

    相关文章

      网友评论

        本文标题:(三)正则表达式入门学习笔记|Python网络爬虫与信息提取

        本文链接:https://www.haomeiwen.com/subject/dsxeoxtx.html