(三)正则表达式入门学习笔记|Python网络爬虫与信息提取
1.正则表达式的概念学习
2.正则表达式的语法学习
3.Re库的基本使用
4.Re库的match对象
5.Re库的贪婪匹配和最小匹配
6.单元小结
最近更新: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个字符,最长是全部字符串。正则表达式会返回最长的结果。如下:
-
如何输出最短的子串呢?