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

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正则表达式概念

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第1张图片
  • 设想我们有一组字符串,不是一个字符串,而是一组。表达一组字符串的方式是一一列举出来。但是这种方式既繁琐又占用空间。因此需要一种简单的表达方式。正则表达式就是为了这种方式而诞生的。
  • 而图上的一组字符串,其实可以用一行正则表达式进行表达。如下:


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

1.2正则表达式的优势

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

1.3正则表达式的案例

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


    (三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第3张图片
  • 用PY+来表示无穷多个以P为开头,但是后面有一个或无穷多个Y的字符串组。所以表示无穷字符串组的时候,正则表达式非常有用。

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


    (三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第4张图片
  • 以上的要求,其实可以枚举出来,因为是有穷个。但是可以枚举但是繁琐。事实上这是一种有某种特点的字符串。但是我们很难枚举出来。在这种情况下,我们可以用正则表达式表示这种特点。可以用以下的形式表达:


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

    1.3正则表达式


    (三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第6张图片
  • 字符串用简洁的方式表达更多的字符串,或者罗列一些特征,正则表达式就是刚好这样的工具。

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

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第7张图片
  • 正则表达式主要应用于字符串的匹配

1.5正则表达式的使用

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第8张图片
  • 用编译,将这个特征是可以表达一组字符串。编译后的一组特征跟一组字符串的特征是对应的。而编译之前的正则表达式符号正则表达式语法的一个单一字符串,但不是真正意义上的表达式。

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

2.1正则表达式的构成

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第9张图片
  • 正则表达式是由字符和操作符构成。

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

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

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

2.3正则表达式语法实例

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

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

2.4经典正则表达式实例

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

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

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


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

3.Re库的基本使用

3.1Re库介绍

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

3.2正则表达式的表示类型

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第17张图片
  • 第一个例子是国内邮政编码,第二个例子是国内电话号码
  • 原生字符串类型与字符串类型的区别,不同的是字符串表示前加一个小写的字符r。原生字符串类型是不包含转义符的字符串。在python语言中,有一个转义符/,那么原生字符串中的斜杠/不被解释为转义符。当正则表达式包含<转义符>,请使用raw string来表达正则表达式。
    (三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第18张图片
    18.jpg

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

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

3.3.1 re.search函数使用


(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第20张图片
  • 这个函数是通过一条正则表达式来匹配一条string,同时用一些标记来控制查找。
  • 常用的标记,有三个,如下:


    (三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第21张图片
  • 以中国邮政编码为例,如下:
>>> import re
>>> match=re.search(r'[1-9]\d{5}','BIT 100081')
>>> if match:
    print(match.group(0))

    
100081
>>> 

3.3.2 re.match函数使用


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

案例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函数使用

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第23张图片
>>> import re
>>> ls=re.findall(r'[1-9]\d{5}','BIT100081  TSU100084')
>>> ls
['100081', '100084']

3.3.4 re.split函数使用


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

案例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函数使用


(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第25张图片
>>> 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函数使用


(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第26张图片
>>> import re
>>> re.sub(r'[1-9]\d{5}',':zipcode','BIT100081  TSU100084')
'BIT:zipcode  TSU:zipcode'
>>> 

3.3.7 汇总Re库主要功能函数


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

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

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

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第28张图片
  • 面向对象用法:将一个正则表达式的字符串编译成为一个正则表达式的类型,叫pat,我们也叫patent类型。然后我们用patent这个对象直接调用search函数,来获得相关结果。这种方法的好处是经过一次编译,当我们多次使用正则表达式使用及匹配时,可以用这种方式加快使用。
  • 介绍re.compile()函数


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

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

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)

看到返回的是sre类型。

4.1 Match对象的属性

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

4.2 Match对象的方法

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第32张图片
  • 还有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库的实例

(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第33张图片
  • PY.*N表示是以PY开头,以N为结尾。N可以有若干个字符串。
  • 以上截图,字符串存在多项匹配,有4个匹配项,同时匹配的长短也不相同,最短有4个字符,最长是全部字符串。正则表达式会返回最长的结果。如下:
(三)正则表达式入门学习笔记|Python网络爬虫与信息提取_第34张图片
  • 如何输出最短的子串呢?


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

5.2最小匹配操作符

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

6.单元小结

6.1Re(正则表达式)入门

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

你可能感兴趣的:((三)正则表达式入门学习笔记|Python网络爬虫与信息提取)