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

一、正则表达式

这里写图片描述

正则表达式的优势:简洁

两个例子:

这里写图片描述

这里写图片描述

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

正则表达式的应用:

这里写图片描述

这里写图片描述

二、正则表达式的语法

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

这里写图片描述

这里写图片描述

这里写图片描述

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

这里写图片描述

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

这里写图片描述

三、Re 库的基本使用

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

这里写图片描述

这里写图片描述

这里写图片描述

各函数举例说明:

1) re.search() :

这里写图片描述

这里写图片描述

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

代码实例:

import re

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

"""
结果如下:
100081
"""

2) re.match() :

这里写图片描述

代码实例:

import re

match_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 re

match_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 re

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

"""
结果如下:
['100081', '100084']
"""

4) re.split() :

这里写图片描述

代码实例:

import re

ls_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 re

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

"""
结果如下:
100081
100084
"""

6) re.sub() :

这里写图片描述

import re

ls = re.sub(r'[1-9]\d{5}', '123', 'BIT100081 TSU100084')
print(ls)

"""
结果如下:
BIT123 TSU123
"""

Re 库的另一种等价用法:

这里写图片描述

这里写图片描述

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

这里写图片描述

四、Match 对象

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

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

import re

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

"""
结果如下:
100081
<class '_sre.SRE_Match'>
"""

这里写图片描述

这里写图片描述

import re

m = 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 TSU100084
re.compile('[1‐9]\\d{5}')
0 19
100081
3 9
(3, 9)
"""

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

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

代码实例:

import re

match = re.search(r'PY.*N', 'PYANBNCNDN')
print(match.group(0))

"""
结果如下:
PYANBNCNDN
"""

最小匹配:

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

import re

match = re.search(r'PY.*?N', 'PYANBNCNDN')
print(match.group(0))

"""
结果如下:
PYAN
"""

这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值