Python re模块核心函数详解:findall、sub、compile、match、search与split
本文系统梳理Python中re模块的六大核心函数。详细解析findall用于提取所有匹配子串,sub实现字符串替换及自定义函数处理,compile用于预编译提升性能,match与search在匹配位置上的区别,以及split按正则分割字符串。涵盖语法、参数说明及实际代码示例,帮助开发者高效掌握正则处理技巧。
re.findall()函数用于在目标字符串中搜索所有符合正则表达式规则的子串,并将结果以列表形式返回。若未找到任何匹配项,则返回空列表。
该函数的主要功能是提取所有匹配内容,适用于需要获取全部匹配结果的场景。
其调用语法如下:
re.findall(pattern, string, flags=0)
参数说明:
pattern:定义匹配规则的正则表达式字符串。
string:需要被搜索的原始字符串。
具体应用示例如下:
场景设定:从一段混合文本中提取所有数字字符。
result = re.findall(r'\d+','1python2hello3')
print(result)
输出结果 ['1', '2', '3']
result = re.findall(r'p%','helloP%ython')
print(result)
输出结果 [] #由于目标字符串中的'P%'与正则表达式'p%'大小写不匹配,且未启用忽略大小写标志,因此返回空列表。
result = re.findall(r'p%','helloP%ython',re.I)
print(result)
输出结果 [P%]
re.sub()函数用于执行字符串替换操作。
其标准语法格式为:
re.sub(pattern, repl, string, count=0, flags=0)
参数详解:
pattern :定义匹配规则的正则表达式。
repl :用于替换匹配内容的字符串,或者是一个处理匹配结果的函数。
string :原始待处理的字符串。
count :指定替换的最大次数,默认为0表示替换所有匹配项。
result = re.sub(r'python','world','hellopython')
print(result)
运行结果 helloworld
当参数设置为函数时,可实现更复杂的替换逻辑。
#需求:将匹配到结果中小于4的替换成8,大于4的替换成9
import re
def modify(value):
matched = value.group()
if int(matched) <= 4:
return '8'
else:
return '9'
str = 'ab12cd34ef567'
result = re.sub('\d', modify, str)
print(result )
运行结果 ab88cd88ef999
适用场景:当需要对匹配成功的部分进行动态处理或复杂逻辑替换时,可通过传入函数实现。
re.compile()函数用于预编译正则表达式。
在Python中调用re模块处理正则时,内部流程通常包括:
- 1)首先编译正则表达式,若表达式语法非法则抛出异常;
- 2)使用编译后的对象进行字符串匹配。
因此,对于需要高频重复使用的正则表达式,预先编译生成Pattern对象可避免重复编译开销,从而显著提升执行效率。
compile函数负责将正则字符串编译为Pattern对象,该对象可被match()和search()等方法复用。
其语法结构为:
re.compile(pattern[, flags])
参数说明:
pattern :表示正则表达式的字符串形式。
flags :可选参数,用于指定匹配模式(如忽略大小写、多行模式等)。
str = 'ab12cd34ef567'
info = re.compile(r'([a-z]{2})(\d{2})')
result = info.match(str).group()
result1 = info.match(str).groups()
print(result)
print(result1)
运行结果 ab12 ('ab', '12')
re.match()函数尝试从字符串的起始位置进行匹配。若起始位置不符合正则规则,则返回None。
该函数的核心特性是仅从字符串开头尝试匹配,失败则返回None。
调用语法如下:
re.match(pattern, string, flags=0)
参数说明:
pattern :匹配用的正则表达式。
string:待匹配的字符串。
flags :标志位,控制匹配行为(如大小写敏感、多行模式等)。
str = 'ab12cd34ef567'
info = re.compile(r'([a-z]{2})(\d{2})')
result = info.match(str).group()
result1 = info.match(str).groups()
print(result)
print(result1)
运行结果 ab12 ('ab', '12')
str1 = '0b12cd34ef567'
result1 = info.match(str1).group()
print(result1)
异常结果:若匹配失败返回None,调用group()方法将引发报错 AttributeError: 'NoneType' object has no attribute 'group'
re.search()函数扫描整个字符串,并返回第一个成功的匹配对象。
与match不同,search会遍历整个字符串寻找首个匹配点。
参数说明:
pattern :匹配用的正则表达式。
string:待匹配的字符串。
flags:标志位,控制匹配行为(如大小写敏感、多行模式等)。
str = 'ab12cd34ef567'
info = re.compile(r'([0-9]{2})')
result = info.search(str).group()
print(result)
运行结果 12
re.match与re.search的主要区别在于匹配范围。
re.match仅检查字符串起始位置,若开头不匹配则直接返回None;
re.search则扫描全字符串,直到找到第一个匹配项为止。
re.split()函数用于根据正则表达式的匹配子串将原字符串分割成列表。
split方法依据匹配到的子串作为分隔符,将字符串切分为列表返回。
其语法格式为:
re.split(pattern, string[, maxsplit=0, flags=0])
参数说明:
pattern:匹配用的正则表达式。
string:待匹配的字符串。
flags:标志位,控制匹配行为(如大小写敏感、多行模式等)。
str = 'abc def g hi'
result = re.split('\W+',str)
print(result)
运行结果 ['abc', 'def', 'g', 'hi']
以上为Python中re模块常用方法的详细解析,更多相关技术内容请参阅本站其他文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













