Python re模块正则表达式使用详解:匹配、替换与分割

周叙
周叙
发布时间:2026-10-15| 7人浏览过
原创

本文详细解析Python中re模块的核心功能,涵盖match、search、findall等匹配方法,sub替换及split分割操作。通过具体代码示例演示参数pattern、string及flags的使用,重点讲解分组匹配与Match对象属性获取,帮助开发者掌握字符串处理技巧。

一、前言

Python内置了re模块以支持正则表达式操作。在实际开发中,开发者可以直接调用re模块提供的函数(如search()、match()、findall()等)对字符串进行处理;或者先通过compile()方法将正则模式字符串编译为正则表达式对象,再利用该对象的方法执行字符串操作。

若在代码中未导入re模块而直接调用相关方法,程序将抛出异常,具体报错信息如图所示:

二、匹配字符串

利用re模块进行字符串匹配,主要依赖match()、search()和findall()等内置方法。

1.使用match()方法进行匹配

match()方法旨在从字符串起始位置尝试匹配。若起始位置匹配成功,则返回一个Match对象;若失败,则返回None。其语法结构如下:

re.match(pattern, string, [flags])

参数说明:

  • pattern:代表模式字符串,即由正则表达式转换而来的匹配规则。
  • string:代表待匹配的原始字符串。
  • flags:可选参数,用于控制匹配行为(例如是否忽略大小写)。常用标志位详见下表:
标志说明
A或ASCII对于\w、\W、\b、\B、\d、\D、\s和\S只进行ASCII匹配(仅适用于Python3.X)
I或IGNORECASE执行不区分字母大小写的匹配
M或MULTILINE将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)
S或DOTALL适用(.)字符匹配所有字符,包括换行符
X或VERBOSE忽略模式字符串中未转义的空格和注释

例如,判断字符串是否以“mr_”开头,且忽略大小写,实现代码如下:

import re

pattern = r"mr_\w+" #模式匹配字符串
string = "MR_SHOP mr_shop" #要匹配的字符串
match = re.match(pattern,string,re.I)#匹配字符,不区分大小写
print(match) #输出匹配结果
string = "项目名称MR_SHOP mr_shop"
match = re.match(pattern,string,re.I)#匹配字符,不区分大小写
print(match) #输出匹配结果

执行结果如下:

从上述运行结果可见,字符串“MR_SHOP”因以“mr_”开头(忽略大小写)而返回Match对象;而“项目名称MR_SHOP”因起始字符不符合条件,直接返回None。这是因为match()严格从字符串首字符开始匹配,一旦首字符不满足条件即停止并返回None。

Match对象中封装了匹配内容的起始位置及具体数据,相关属性与方法包括:

  • 调用Match对象的start()方法可获取匹配内容的起始索引;
  • 调用end()方法可获取匹配内容的结束索引;
  • 通过span()方法可返回包含起始和结束位置的元组;
  • 利用string属性可获取原始待匹配字符串。

具体代码如下:

import re
pattern = r"mr_\w+"  # 模式匹配字符串
string = "MR_SHOP mr_shop"  # 要匹配的字符串
match = re.match(pattern, string, re.I)  # 匹配字符,不区分大小写
print("匹配值的起始位置", match.start())
print("匹配值的结束位置", match.end())
print("匹配位置元组", match.span())
print("要匹配的字符串", match.string)
print("匹配数据", match.group())

执行结果如下:

2.使用search()方法进行匹配

search()方法用于在整个字符串中搜索第一个符合正则表达式的子串。若找到匹配项,返回Match对象;否则返回None。语法格式如下:

re.search(pattern, string, [flags])

参数说明:

  • pattern:代表模式字符串,由正则表达式转换而来。
  • string:代表待匹配的字符串。
  • flags:可选参数,用于控制匹配方式(如是否区分大小写)。

例如,针对以“mr_”开头的字符串进行不区分大小写的匹配,代码如下:

import re

pattern = r"mr_\w+" #模式匹配字符串
string = "MR_SHOP mr_shop" #要匹配的字符串
match = re.search(pattern,string,re.I)#匹配字符,不区分大小写
print(match) #输出匹配结果
string = "项目名称MR_SHOP mr_shop"
match = re.search(pattern,string,re.I)#匹配字符,不区分大小写
print(match) #输出匹配结果

执行结果如下:

对比运行结果可知,search()方法不仅限于字符串起始位置,只要字符串中任意位置存在符合模式的子串,即可成功匹配。

3.使用findall()方法进行匹配

findall()方法用于在整个字符串中查找所有符合正则表达式的子串,并以列表形式返回。若匹配成功,返回包含所有匹配结果的列表;若无匹配项,则返回空列表。语法格式如下:

re.findall(pattern, string, [flags])

参数说明:

  • pattern:代表模式字符串,由正则表达式转换而来。
  • string:代表待匹配的字符串。
  • flags:可选参数,用于控制匹配方式(如是否区分大小写)。

例如,对以“mr_”开头的字符串进行不区分大小写的匹配,代码如下:

import re

pattern = r"mr_\w+" #模式匹配字符串
string = "MR_SHOP mr_shop" #要匹配的字符串
match = re.findall(pattern,string,re.I)#匹配字符,不区分大小写
print(match) #输出匹配结果
string = "项目名称MR_SHOP mr_shop"
match = re.findall(pattern,string,re.I)#匹配字符,不区分大小写
print(match) #输出匹配结果

执行结果如下:

若模式字符串中包含分组(括号部分),findall()将返回与分组匹配的文本列表,而非整个模式的匹配结果。例如:

import re

pattern = r"[1-9]{1,3}(\.[0-9]{1,3}){3}"  # 模式字符串
str1 = "127.0.0.1 192.168.1.66"  # 要匹配的字符串
match = re.findall(pattern, str1)  # 进行模式匹配
print(match)

执行结果如下:

从上述结果可见,并未直接获取到完整的IP地址,原因在于模式中使用了分组,导致返回的是分组内的匹配内容,即“(.[0-9]{1,3})”的匹配结果。若需获取整个模式的匹配值,可将整个模式用一对小括号包裹形成分组,并在处理结果时,仅提取返回列表中每个元组的第1个元素。代码如下:

import re

pattern = r"([1-9]{1,3}(\.[0-9]{1,3}){3})"  # 模式字符串
str1 = "127.0.0.1 192.168.1.66"  # 要匹配的字符串
match = re.findall(pattern, str1)  # 进行模式匹配
for item in match:
    print(item[0])

执行结果如下:

三、替换字符串

sub()方法用于执行字符串替换操作,语法格式如下:

re.sub(pattern, sep1, string, count, flags)

参数说明:

  • pattern:代表模式字符串,由正则表达式转换而来。
  • sep1:代表用于替换的新字符串。
  • string:代表原始待处理字符串。
  • count:可选参数,指定最多替换的次数。
  • flags:可选参数,用于控制匹配方式(如是否区分大小写)。
import re

pattern = r"1[34578]\d{9}"  # 定义要替换的模式字符串
string = "中奖号码为:84978981 联系电话为:13611111111"
result = re.sub(pattern, "1xxxxxxxxxx", string)
print(result)

执行结果如下:

四、使用正则表达式分割字符串

split()方法(注:原文拼写为splist,此处按标准修正或保留原意说明)用于根据正则表达式分割字符串,并以列表形式返回。其功能类似于字符串对象的split()方法,区别在于分割符由正则模式指定。语法格式如下:

re.split(pattern, string, [maxsplit], [flags])

参数说明:

  • pattern:代表模式字符串,由正则表达式转换而来。
  • string:代表待分割的字符串。
  • maxsplit:可选参数,指定最大分割次数。
  • flags:可选参数,用于控制匹配方式(如是否区分大小写)。

例如,从给定的URL地址中提取请求路径及参数,代码如下:

import re

pattern = r"[?|&]"  # 定义分割符
url = 'http://www.baidu.com/login.jsp?username="mr"&pwd="mrsoft"'
result = re.split(pattern, url)  # 分割字符串
print(result)

执行结果如下:

总结

本文介绍了Python中re模块实现正则表达式匹配、替换与分割的核心操作。更多Python正则表达式相关内容,可参考本站过往文章或继续浏览后续教程,感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。