Logo

郎哥编程

正则表达式对象

2020-12-30 146

正则表达式对象是Pattern类型的实例(也称为正则对象),正则对象提供了一些方法和属性用来支持正则运算。

re模块的compile函数可以返回一个正则对象。

函数声明:compile(pattern, flags=0)

函数将正则表达式的模式串编译为一个正则对象,用于匹配字符串。使用正则对象可以高效处理同一模式多次匹配的问题。

对象的方法

正则对象支持的方法如下表所示:

18.png

注释(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方法功能相同,该方法返回一个元组(字符串,替换次数)

对象的属性

19.png

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论