正则表达式
正则表达式(又称规则表达式)是一组特殊的字符串,通常被用来检索、替换那些符合某个模式(规则)的字符串。
许多程序设计语言都支持利用正则表达式进行字符串操作。Python 自1.5版本起增加了re 模块,提供 Perl 风格的正则表达式模式,re 模块使 Python 语言拥有全部的正则表达式功能。下面讲解正则表达式在Python中的一些简单应用。
正则表达式的常用方法或函数
compile函数
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
正则对象 = compile(正则表达式语法)
match函数
如果正则表达式中没有设置^开头和
结
尾
限
制
这
种
操
作
,
m
a
t
c
h
的
作
用
类
似
于
验
证
待
校
验
字
符
串
是
否
以
正
则
表
达
式
对
应
的
字
符
串
内
容
开
头
;
如
果
正
则
表
达
式
中
设
置
了
开
头
和
结尾限制这种操作,match的作用类似于验证待校验字符串是否以正则表达式对应的字符串内容开头;如果正则表达式中设置了^开头和
结尾限制这种操作,match的作用类似于验证待校验字符串是否以正则表达式对应的字符串内容开头;如果正则表达式中设置了开头和结尾限制这种操作,match的作用检查待校验的字符串的整体内容是否符合正则表达式的语法。
如果找到满足要求的字符串,返回Match对象,否则返回None。下面是2个实例
import re
#生成一个对应的正则对象
re_obj = re.compile("hello")
#match验证
res = re_obj.match("Hello good good study")
#输出结果
print(res)
结果输出为:None
import re
re_obj = re.compile("^hello$")
res = re_obj.match("hello")
print(res)
结果输出为:<_sre.SRE_Match object; span=(0, 5), match=‘hello’>
search函数
在待查询的字符串中查找是否有满足正则表达式的子串,如果有返回查找到的第一个子串对应的匹配Match对象,如果没有返回None。
import re
re_obj = re.compile("to")
res = re_obj.search("nice to meet you hello nice to meet you too")
结果输出为:<_sre.SRE_Match object; span=(5, 7), match=‘to’>
findall函数
在待查询的字符串中查找是否有满足正则表达式的子串,有的话将其放在列表中返回,没有的话返回空列表。
import re
s = "i13love14you520"
re_obj = re.compile("[0-9]+")
res = re_obj.findall(s)
print(f"{'+'.join(res)} = {eval('+'.join(res))}")
结果输出为:13+14+520 = 547
finditer函数
在待查询的字符串中查找是否有满足正则表达式的子串,将检验到的数据对应的Match对象放在迭代器中返回。
s = "i13love14you520"
re_obj = re.compile("[0-9]+")
res_iter = re_obj.finditer(s)
print(res_iter)
结果输出为:<callable_iterator object at 0x000002560E19BD30>
查看其存储的结果
for ele in res_iter:
print(ele)
输出为:
<_sre.SRE_Match object; span=(1, 3), match=‘13’>
<_sre.SRE_Match object; span=(7, 9), match=‘14’>
<_sre.SRE_Match object; span=(12, 15), match=‘520’>
可使用下列代码更方便地查看其中的结果
num_list = [ele.group() for ele in res_iter]
print(num_list)
str_res = " + ".join(num_list)
print(f"{str_res} = {eval(str_res)}")
最终输出结果为:[‘13’, ‘14’, ‘520’]
split函数
在待切割的字符串中以正则表达式对应的内容为切割符,对字符串进行切割,返回列表。
import re
s = "i13love14you520hi"
re_obj = re.compile("[^0-9]+")
res_list = re_obj.split(s)
print(res_list)
结果输出为:[’’, ‘13’, ‘14’, ‘520’, ‘’]
去除其中的空字符串
str_list = [ele for ele in res_list if ele != ""]
print(str_list)
结果输出为:[‘13’, ‘14’, ‘520’]
sub函数
re模块中也提供了用于替换字符串的函数sub(新子串,待替换的子串)。
import re
s = "1314"
re_obj = re.compile("1")
res = re_obj.sub("一", s)
print(res)
结果输出为:一3一4
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 \t )匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式 | 描述 |
---|---|
.(点) | 通配符,可以匹配除了\n之外的任意一个字符。若要表示其原本的意思,点前面要加\ |
^ | 匹配字符串每一行的开头 |
$ | 匹配字符串每一行的末尾 |
\Z | 匹配字符串的末尾 |
[…] | 用来表示一组字符中的任意一个,[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的任意一个字符。 |
\d | 表示的是0-9中任意一个字符 |
\D | 表示的是除了0-9之外任意一个字符 |
\w | 数字字母下划线和汉字中的任意一个 |
\W | 非数字字母下划线和汉字中的任意一个 |
\s | 表示的是任意空白字符中的一个 |
\S | 表示的是非任意空白字符中的一个 |
\b | 单词的边界 |
\B | 单词非边界 |
re.I | 忽略大小写的情况下进行匹配 |
re.M | 将数据视作多行进行匹配 |
re.S | 将内容视作一行进行匹配,在这种模式下 .可以匹配\n |
x* | 表示x连续出现任意次 [可有可无] |
x+ | 表示x连续出现至少1次 |
x? | 表示x最多出现1次 |
x{m,n} | 表示x最少连续出现m次 最多连续出现n次 |
x{m,} | 表示x最少连续出现m次 |
x{m} | 表示x必须连续出现m次 |
\num | 后面匹配出的内容与前面某组匹配出的内容一模一样 就可以使用\num模式,num为数值看与哪个小组内容匹配 num就是几 (从1开始的)。<([a-zA-Z]+)> </\1> |
下面用三个例子来进行演示:
例1 验证邮箱格式是否正确(只能包含数字字母下划线 长度最小是6 最大是16)
import re
re_obj = re.compile(r"^[0-9a-zA-Z_]{6,16}@(qq|sina|163)\.(com|cn|net)$")
res = re_obj.match("12367@qq.com")
if res:
print("邮箱格式正确")
else:
print("邮箱格式错误")
结果输出为:邮箱格式错误
例2 验证录入的地址是否合法
import re
re_obj = re.compile(r"^((2[0-4]\d|25[0-5]|1?\d?\d)\.){3}(2[0-4]\d|25[0-5]|1?\d?\d)$")
res = re_obj.match("2.0.25.0")
print(res)
结果输出为:<_sre.SRE_Match object; span=(0, 8), match=‘2.0.25.0’>
例3 利用正则表达式提取字符串中的数值[包括正数与负数 整数与小数], 并对其进行累加。
import re
re_obj = re.compile(r"[-]?(0|[1-9]\d*)(\.\d+)?")
s = "i12323love3.14are-2.71you0.28"
res_iter = re_obj.finditer(s)
data_list = [ele.group() for ele in res_iter]
expression_str = "+".join(data_list)
print(f"{expression_str} = {eval(expression_str)}")
结果输出为:12323+3.14±2.71+0.28 = 12323.710000000001