正则表达式对象是Pattern类型的实例(也称为正则对象),正则对象提供了一些方法和属性用来支持正则运算。
re模块的compile函数可以返回一个正则对象。
函数声明:compile(pattern, flags=0)
函数将正则表达式的模式串编译为一个正则对象,用于匹配字符串。使用正则对象可以高效处理同一模式多次匹配的问题。
对象的方法
正则对象支持的方法如下表所示:

注释(1)
方法声明:
search(string[, pos[, endpos]])
从string的开始查找与模式串第一个匹配的索引位置,并返回一个相应的 Match对象(匹配对象),如果没有匹配,就返回 None。
参数pos和endpos是可选参数,分别给出了搜索string的起始索引和终止索引。若给出了pos和endpos,string只有从 pos 到 endpos - 1 的子串会被匹配。
案例代码:
import re
# 创建正则对象
pattern = re.compile("d")
# 调用pattern的search函数进行匹配
m = pattern.search("dog")
print(m)
# 设置待匹配字符串的起始索引为1
m = pattern.search("dog",1)
print(m)
程序输出结果如下:
<re.Match object; span=(0, 1), match='d'>
None
从输出结果可以看出,第1个匹配成功,第2个匹配失败。
注释(2)
方法声明:
match(string[, pos[, endpos]])
从 string 的 开始位置若能够找到与模式串任意个匹配,就返回一个相应Match对象。如果不匹配,就返回 None。
参数pos和endpos是可选参数,分别给出了匹配string的起始索引和终止索引。若给出了pos和endpos,string只有从 pos 到 endpos - 1 的子串会被匹配。
案例代码:
import re
# 创建正则对象
pattern = re.compile("o")
# 调用pattern的match函数进行匹配
m = pattern.match("dog")
print(m)
# 设置待匹配字符串的起始索引为1
m = pattern.match("dog",1)
print(m)
程序执行结果如下图所示:
None
<re.Match object; span=(1, 2), match='o'>
从输出结果可以看出,第1个匹配失败,因为字符串dog开始的第1个字符不能匹配模式串o。第2个匹配从字符串dog的索引1开始,因此匹配成功。
注释(3)
方法声明:
fullmatch(string[, pos[, endpos]])
若整个 string 匹配模式串,就返回一个相应的Match对象。否则就返回 None。
参数pos和endpos是可选参数,分别给出了匹配string的起始索引和终止索引。若给出了pos和endpos,string只有从 pos 到 endpos - 1 的子串会被匹配。
案例代码:
import re
# 创建正则对象
pattern = re.compile("o[gh]")
# 调用pattern的fullmatch函数匹配dog
m = pattern.fullmatch("dog")
print(m)
# 调用pattern的fullmatch函数匹配ogre
m = pattern.fullmatch("ogre")
print(m)
# 调用pattern的fullmatch函数匹配ogre
# 设置待匹配字符串的起始索引为1
m = pattern.fullmatch("doggie",1,3)
print(m)
程序执行结果如下所示:
None
None
<re.Match object; span=(1, 3), match='og'>
从执行结果可以看出,匹配1和匹配2都失败,只有匹配3成功,匹配3设置了待匹配字符串的起始索引和终止索引,索引范围之内的字符串完全匹配模式串。
注释(4)
方法声明:
split(string, maxsplit=0)
用模式串来分隔string。若在模式串中捕获到括号,那么所有的组里的文字也会包含在列表里。若参数 maxsplit 非零,最多进行 maxsplit 次分隔,剩下的字符全部返回到列表的最后一个元素。
案例代码:
程序执行结果如下所示:
['Java', 'Python', 'Net', ''] ['Java', 'Python, Net.']
注释(5)
方法声明:
findall(string[, pos[, endpos]])
使用模式串匹配string, 返回一个不重复的匹配列表,string 从左到右开始匹配,匹配项按找到的顺序返回。若模式串存在一到多个组(用括号构成的子表达式),返回被子表达式匹配的组合列表。
参数pos和endpos是可选参数,分别给出了匹配string的起始索引和终止索引。若给出了pos和endpos,string只有从 pos 到 endpos - 1 的子串会被匹配。
案例代码:
(案例代码见课程资源unit10/case06.py)
import re
# 创建正则对象
pattern1 = re.compile("(\w+)\s+\w+")
# 调用pattern的findall方法
m = pattern1.findall("abcdefg acbdgef abcdgfe cadbgfe")
print(m)
# 通过正则表达式创建正则对象
pattern2 = re.compile("\w+\s+\w+")
# 调用pattern2的findall方法
m = pattern2.findall("abcdefg acbdgef abcdgfe cadbgfe")
print(m)
程序输出结果如下:
['abcdefg', 'abcdgfe']
['abcdefg acbdgef', 'abcdgfe cadbgfe']
第1个匹配的模式串带有1个子表达式,其返回的内容就是子表达式匹配到的结果,而不是整个正则表达式所匹配到的结果。
第2个匹配的模式串没有子表达式,,其返回的内容就是整个正则表达式匹配到的结果。
注释(6)
方法声明:
finditer(string[, pos[, endpos]])
功能同findall方法,但该方法返回一个保存了匹配对象(Match)的迭代器对象。
案例代码:
import re
# 创建正则对象
pattern = re.compile("(\d+)@(\w+).com")
# 手机号邮箱地址
content ="email:12345678@163.com\
email:2345678@163.com\
email:345678@163.com\
"
# 调用pattern的finditer方法使用模式串匹配content
m = pattern.finditer(content)
# 迭代输出匹配项
for i in m:
print(m)
程序输出结果如下:
<callable_iterator object at 0x0000016B9AAB2340>
<callable_iterator object at 0x0000016B9AAB2340>
<callable_iterator object at 0x0000016B9AAB2340>
从输出结果可以看出,执行finditer方法后,返回的结果是迭代器,每个迭代器保存了个一个匹配对象(Match)。
注释(7)
方法声明:
sub(repl, string, count=0)
返回通过使用 repl 替换在string 最左边非重叠出现的匹配字符串而获得的字符串,若模式串没有匹配成功,返回原string。
repl 可以是字符串或函数,若为字符串,则其中任何反斜杠转义序列都会被处理。
repl若是函数,该函数会对每个非重复出现的匹配字符串进行处理,函数只能传入一个匹配对象(Match对象),函数会返回替换后的字符串。
可选参数 count 是要替换的最大次数;count 必须是非负整数。如果忽略这个参数,或者设置为0,所有的匹配都会被替换。
案例代码1:
import re
# 创建正则对象
pattern = re.compile("@(\w+).com")
# 手机号邮箱地址
content ="email:12345678@163.com\
email:2345678@163.com\
email:345678@163.com\
"
# 将content的163.com替换为net.com
m = pattern.sub("@net.com\n",content)
print(m)
程序执行结果如下:
email:12345678@net.com
email:2345678@net.com
email:345678@net.com
案例代码2:
import re
# 定义替换处理函数
def p1(matchobj):
s = "@net.com\n"
return s
# 创建正则对象
pattern = re.compile("@(\w+).com")
# 手机号邮箱地址
content ="email:12345678@163.com\
email:2345678@163.com\
email:345678@163.com\
"
# 调用p1函数处理待替换的字符串
m = pattern.sub(p1,content)
print(m)
案例代码2定义了p1函数,用于处理待替换的字符串,p1函数仅是简单了返回了一个字符串,这个字符串将替换掉当前匹配的字符串。
程序执行结果如下所示:
email:12345678@net.com
email:2345678@net.com
email:345678@net.com
注释(8)
方法声明:
subn(repl, string, count=0)
与sub方法功能相同,该方法返回一个元组(字符串,替换次数)
对象的属性
