Python正则表达式核心函数全解析:match、search、compile与替换分割

陆遥
陆遥
发布时间:2026-10-13 | 6人浏览过
原创

本文深入解析Python中re模块的核心正则处理函数。详细讲解re.match与re.search在匹配位置上的差异,介绍re.compile生成正则对象以优化性能的方法。同时涵盖findall、finditer获取所有匹配项,以及split和sub进行字符串分割与替换的高级用法,配合代码示例说明参数flags及贪婪非贪婪匹配机制。

正则表达式基础与Python re模块介绍

正则表达式是一种特殊的字符序列,旨在简洁地描述一组字符串的特征,用于检查字符串是否匹配特定模式,使用便捷高效。

在Python环境中,我们通过导入并调用re模块来使用正则表达式功能。

import re

关于正则表达式的语法模式及操作符的详细说明,可参考:https://www.runoob.com/python/python-reg-expressions.html#flags

接下来将逐一介绍Python中常用的正则表达式处理函数及其应用场景。

re.match:起始位置匹配详解

re.match函数

re.match函数尝试从字符串的起始位置开始匹配正则表达式,若匹配成功则返回match对象;若起始位置不匹配,则返回None。

函数签名:re.match(pattern, string, flags=0)

pattern:需要匹配的正则表达式模式。

string:待进行匹配操作的字符串。

flags:标志位,用于控制正则表达式的匹配行为,例如是否忽略大小写、是否进行多行匹配等。具体参数如下:

re.I:忽略大小写匹配。

re.L:使特殊字符集 \w, \W, \b, \B, \s, \S 的匹配行为依赖于当前本地环境。

re.M:启用多行模式。

re.S:使点号 . 匹配包括换行符在内的所有字符(默认情况下 . 不匹配换行符)。

re.U:使特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 的匹配行为依赖于Unicode字符属性数据库。

re.X:为了增强可读性,允许在正则表达式中忽略空格以及 # 符号后的注释内容。


import re
#从起始位置匹配
r1=re.match('abc','abcdefghi')
print(r1)
#不从起始位置匹配
r2=re.match('def','abcdefghi')
print(r2)

运行结果:

其中,span属性表示匹配成功的整个子串在原字符串中的索引范围。

可以通过调用匹配对象的group(num)或groups()函数来获取具体的匹配内容。

group(num):返回匹配的整个表达式的字符串;若group()传入多个组号,则返回包含对应组值的元组。

groups():返回一个包含所有子组字符串的元组,索引从1到子组的最大编号。


import re

s='This is a demo'
r1=re.match(r'(.*) is (.*)',s)
r2=re.match(r'(.*) is (.*?)',s)

print(r1.group())
print(r1.group(1))
print(r1.group(2))
print(r1.groups())
print()
print(r2.group())
print(r2.group(1))
print(r2.group(2))
print(r2.groups())

运行结果:

上述代码中的(.*)和(.*?)分别代表正则表达式中的贪婪匹配与非贪婪匹配,更多细节可参考:https://www.jb51.net/article/31491.htm

re.search:全局扫描与匹配差异

re.search函数

re.search函数会扫描整个字符串,并返回第一个成功的匹配结果;若匹配成功则返回match对象,否则返回None。

函数签名:re.search(pattern, string, flags=0)

pattern:匹配的正则表达式。

string:待匹配的字符串。

flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。


import re
#从起始位置匹配
r1=re.search('abc','abcdefghi')
print(r1)
#不从起始位置匹配
r2=re.search('def','abcdefghi')
print(r2)

运行结果:

同样可以使用group(num)或groups()匹配对象函数来获取匹配表达式。

group(num=0):返回匹配的整个表达式的字符串;group()可以一次输入多个组号,此时将返回包含那些组所对应值的元组。

groups():返回一个包含所有小组字符串的元组,索引从1到所含的小组号。


import re

s='This is a demo'
r1=re.search(r'(.*) is (.*)',s)
r2=re.search(r'(.*) is (.*?)',s)

print(r1.group())
print(r1.group(1))
print(r1.group(2))
print(r1.groups())
print()
print(r2.group())
print(r2.group(1))
print(r2.group(2))
print(r2.groups())

运行结果:

通过对比不难发现re.match与re.search的主要区别:re.match仅匹配字符串的起始位置,若起始位置不符合正则表达式则直接匹配失败;而re.search则扫描整个字符串,直到找到第一个匹配项为止。

re.compile:预编译优化与使用

re.compile函数

compile函数用于将正则表达式字符串编译成正则表达式对象,以便在后续调用match()和search()等函数时重复使用,提高执行效率。

函数签名:re.compile(pattern[, flags])

pattern:一个字符串形式的正则表达式。

flags:可选参数,表示匹配模式,例如忽略大小写、多行模式等。


import re
#匹配数字
r=re.compile(r'\d+') 
r1=r.match('This is a demo')
r2=r.match('This is 111 and That is 222',0,27)
r3=r.match('This is 111 and That is 222',8,27)
 
print(r1)
print(r2)
print(r3)

运行结果:

findall与finditer:获取所有匹配项

findall函数

该函数搜索字符串,以列表形式返回正则表达式匹配的所有子串;若未找到任何匹配项,则返回空列表。

需要注意的是,match和search仅匹配一次,而findall会匹配所有符合条件的子串。

函数签名:findall(string[, pos[, endpos]])

string:待匹配的字符串。

pos:可选参数,指定字符串的起始搜索位置,默认为0。

endpos:可选参数,指定字符串的结束搜索位置,默认为字符串的长度。


import re
#匹配数字
r=re.compile(r'\d+') 
r1=r.findall('This is a demo')
r2=r.findall('This is 111 and That is 222',0,11)
r3=r.findall('This is 111 and That is 222',0,27)
 
print(r1)
print(r2)
print(r3)

运行结果:

re.finditer函数

与findall类似,finditer在字符串中找到正则表达式所匹配的所有子串,并将它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

pattern:匹配的正则表达式。

string:待匹配的字符串。

flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。


import re 

r=re.finditer(r'\d+','This is 111 and That is 222')
for i in r: 
 print (i.group())

运行结果:

re.split与re.sub:字符串分割与替换

re.split函数

该函数将一个字符串按照正则表达式匹配的子串进行分割,并以列表形式返回分割后的结果。

函数签名:re.split(pattern, string[, maxsplit=0, flags=0])

pattern:匹配的正则表达式。

string:待匹配的字符串。

maxsplit:分割次数限制,maxsplit=1表示最多分割一次,默认为0表示不限次数。

flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。


import re 

r1=re.split('\W+','This is 111 and That is 222') 
r2=re.split('\W+','This is 111 and That is 222',maxsplit=1) 
r3=re.split('\d+','This is 111 and That is 222') 
r4=re.split('\d+','This is 111 and That is 222',maxsplit=1) 
print(r1)
print(r2)
print(r3)
print(r4)

运行结果:

re.sub函数

re.sub函数用于替换字符串中符合正则表达式匹配的子串。

re.sub(pattern, repl, string, count=0, flags=0)

pattern:正则中的模式字符串。

repl:替换的字符串,也可以是一个函数。

string:要被查找并替换的原始字符串。

count:模式匹配后替换的最大次数,默认0表示替换所有匹配项。


import re 

r='This is 111 and That is 222'
# 删除字符串中的数字
r1=re.sub(r'\d+','',r)
print(r1)
# 删除非数字的字符串 
r2=re.sub(r'\D','',r)
print(r2)

运行结果:

参考资料:

https://www.runoob.com/python/python-reg-expressions.html#flags

到此这篇关于Python常用的正则表达式处理函数详解的文章就介绍到这了,更多相关python 正则表达式处理函数内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表