python系列之re模块(正则表达式)

来源:互联网 发布:瑞尔森大学怎么样知乎 编辑:程序博客网 时间:2024/05/16 03:23

一、正则表达式

这里写图片描述

正则表达式的优势:简洁

两个例子:

这里写图片描述

这里写图片描述

正则表达式是用来简洁表达一组字符串的表达式;
正则表达式是一种通用的字符串表达框架;
正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具;
正则表达式可以用来判断某字符串的特征归属。

正则表达式的应用:

这里写图片描述

这里写图片描述

二、正则表达式的语法

正则表达式语法由字符和操作符构成。

这里写图片描述

这里写图片描述

这里写图片描述

在下面的经典实例中,“正整数形式的字符串”开头可能是 0,觉得开头不能为 0,不过它应该是把 01 与 1 视为等价的,这样想的话是没问题的。不过,我自己更倾向于写成:”^[1-9][0-9]*$”或者”^[1-9]\d*$

这里写图片描述

下图 IP 地址正则表达式中,前两种都不是精确匹配。

这里写图片描述

三、Re 库的基本使用

Re库是Python的标准库,主要用于字符串匹配。
调用方式:import re

这里写图片描述

这里写图片描述

这里写图片描述

各函数举例说明:

1) re.search() :

这里写图片描述

这里写图片描述

【注】正则表达式中的 ‘.’ 操作符能够匹配所有字符,但不包括换行符,即默认匹配除换行外的所有字符;利用 ‘re.S’ 就可以匹配包括换行符在内的所有字符。

代码实例:

import rematch_obj = re.search(r'[1-9]\d{5}', 'BIT 100081')if match_obj:    print(match_obj.group(0))"""结果如下:100081"""

2) re.match() :

这里写图片描述

代码实例:

import rematch_obj= re.match(r'[1-9]\d{5}', 'BIT 100081')if match_obj:    print(match_obj.group(0))else:    print('None')"""结果如下:None"""

在上面的代码中,由于 re.match() 函数是从字符串的首位开始匹配,而”BIT 100081”中首位并不是数字,不能匹配,因此此时 match_obj 为空(一个空的 match 对象)。

将”BIT 100081”改成”100081 BIT”就能匹配,代码如下:

import rematch_obj = re.match(r'[1-9]\d{5}', '100081 BIT')if match_obj:    print(match_obj.group(0))else:    print('None')"""结果如下:100081"""

3) re.findall() :

这里写图片描述

代码实例:

import rels = re.findall(r'[1-9]\d{5}', 'BIT100081 TSU100084')print(ls)"""结果如下:['100081', '100084']"""

4) re.split() :

这里写图片描述

代码实例:

import rels_1 = re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084')print(ls_1)ls_2 = re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084', maxsplit = 1)print(ls_2)"""结果如下:['BIT', ' TSU', '']     # 注意最后一个是空字符串,不是空格['BIT', ' TSU100084']"""

5) re.finditer() :

这里写图片描述

import refor m in re.finditer(r'[1-9]\d{5}', 'BIT100081 TSU100084'):    if m:        print(m.group(0))"""结果如下:100081100084"""

6) re.sub() :

这里写图片描述

import rels = re.sub(r'[1-9]\d{5}', '123', 'BIT100081 TSU100084')print(ls)"""结果如下:BIT123 TSU123"""

Re 库的另一种等价用法:

这里写图片描述

这里写图片描述

下面的函数与上面的函数功能一一对应,但是用法略有不同,下面的函数不需要“正则表达式的字符串或原声字符串表示”这个参数。

这里写图片描述

四、Match 对象

Match对象是一次匹配的结果,包含匹配的很多信息。

从下面的代码可以看出 Match 对象的类型:

import rematch = re.search(r'[1‐9]\d{5}', 'BIT 100081')if match:    print(match.group(0))    print(type(match))"""结果如下:100081<class '_sre.SRE_Match'>"""

这里写图片描述

这里写图片描述

import rem = re.search(r'[1‐9]\d{5}', 'BIT100081 TSU100084')print(m.string)print(m.re)print(m.pos, m.endpos)print(m.group(0))print(m.start(), m.end())print(m.span())"""结果如下:BIT100081 TSU100084re.compile('[1‐9]\\d{5}')0 191000813 9(3, 9)"""

五、Re 库的贪婪匹配和最小匹配

Re库默认采用贪婪匹配,即输出匹配最长的子串

代码实例:

import rematch = re.search(r'PY.*N', 'PYANBNCNDN')print(match.group(0))"""结果如下:PYANBNCNDN"""

最小匹配:

如何输出最短的子串呢?在后面加个“?”即可。

import rematch = re.search(r'PY.*?N', 'PYANBNCNDN')print(match.group(0))"""结果如下:PYAN"""

这里写图片描述

【参考】北京理工大学网络公开课《Python网络爬虫与信息提取》

原创粉丝点击