一、正则表达式
正则表达式的优势:简洁
两个例子:
正则表达式是用来简洁表达一组字符串的表达式;
正则表达式是一种通用的字符串表达框架;
正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具;
正则表达式可以用来判断某字符串的特征归属。
正则表达式的应用:
二、正则表达式的语法
正则表达式语法由字符和操作符构成。
在下面的经典实例中,“正整数形式的字符串”开头可能是 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
"""