Python3 正则表达式
- Python 3 使用
re
模块处理正则表达式,适合匹配和操作字符串模式。 - 导入
re
模块后,可用search
、match
、sub
等函数进行模式匹配和替换。 - 建议使用原始字符串(如
r'\d'
)编写模式,避免反斜杠问题。 - 正则表达式语法包括
.
(匹配任意字符)、\d
(匹配数字)、*
(零或多次重复)等。
模块概述
Python 3 的 re
模块提供与 Perl 类似的正则表达式功能,支持 Unicode 和字节字符串,但不能混用。常用函数如 re.search()
在字符串中查找模式,re.match()
检查字符串开头是否匹配,re.sub()
用于替换匹配的模式。
示例
以下示例检查字符串是否包含数字:
import re
string = "Hello 123"
if re.search(r'\d', string):
print("包含数字")
else:
print("不包含数字")
输出为“包含数字”,因为字符串中有数字。
语法基础
正则表达式有特殊符号:
.
匹配除换行外的任意字符。\d
匹配单个数字。\w
匹配字母、数字或下划线。*
表示零或多次重复。+
表示一次或多次重复。[abc]
匹配 a、b 或 c。[^abc]
匹配除 a、b、c 外的任意字符。
更多详情请参考官方文档 re — 正则表达式操作 和 正则表达式指南。
详细报告
本文旨在全面介绍 Python 3 中的正则表达式(正则表达式),涵盖其基本概念、模块功能、语法规则及实际示例,适合初学者和有一定基础的用户参考。以下内容基于权威资源和示例分析,确保信息准确且实用。
背景与模块介绍
正则表达式是一种用于匹配字符串的强大工具,广泛应用于文本处理、数据提取和验证等场景。在 Python 3 中,通过内置的 re
模块实现正则表达式功能。该模块提供与 Perl 类似的匹配操作,支持 Unicode 字符串(str
)和 8 位字节串(bytes
),但两者不能混用。例如,Unicode 字符串模式不能与字节串匹配,反之亦然,替换字符串的类型也需与模式和搜索字符串一致。
re
模块的源代码位于 Lib/re/,其功能包括模式匹配、搜索和替换等。大多数操作可通过模块函数(如 re.search()
)直接调用,也可通过编译正则表达式对象(如 re.compile()
)进行优化,适合重复使用场景。文档还提到第三方模块 regex 提供更多功能和增强的 Unicode 支持,适合高级用户。
核心功能与使用方法
re
模块提供多种函数,满足不同需求。以下是常见函数的概述:
re.search(pattern, string)
: 在字符串中查找模式,返回第一个匹配项的 Match 对象,若无匹配返回 None。re.match(pattern, string)
: 检查字符串开头是否匹配模式,仅在开头匹配时返回 Match 对象,否则返回 None。re.fullmatch(pattern, string)
: 检查整个字符串是否完全匹配模式,若匹配返回 Match 对象,否则返回 None。re.sub(pattern, repl, string)
: 替换字符串中所有匹配模式的子串,返回替换后的新字符串。re.findall(pattern, string)
: 返回字符串中所有非重叠匹配的列表。re.finditer(pattern, string)
: 返回一个迭代器,包含所有匹配的 Match 对象,适合获取匹配位置信息。
这些函数的使用通常建议采用原始字符串(如 r'\d'
),因为正则表达式中反斜杠(\'
)有特殊含义,与 Python 字符串字面值的转义冲突。例如,r"\n"
表示 '\'
和 'n'
,而 "\n"
表示换行符。这种做法避免了无效转义序列的 SyntaxWarning,并在未来版本可能升级为 SyntaxError。
实际示例分析
以下是几个典型示例,展示 re
模块的实际应用:
-
检查字符串是否包含数字
示例代码:import re string = "Hello 123" if re.search(r'\d', string): print("包含数字") else: print("不包含数字")
输出为“包含数字”,因为字符串中有数字“123”。这里使用
r'\d'
匹配任意数字,re.search()
查找任意位置的匹配。 -
搜索与匹配的区别
re.match("c", "abcdef")
返回 None,因为“c”不在字符串开头。re.search("c", "abcdef")
返回 Match 对象,因为“c”在字符串中。re.fullmatch("p.*n", "python")
返回 Match 对象,因为整个字符串“python”匹配模式“p.*n”(p 后面任意字符到 n)。
这展示了match()
只检查开头,search()
检查任意位置,fullmatch()
要求完全匹配。
-
文本替换
示例:使用re.sub()
移除非数字内容。import re phone = "2004-959-559 # 这是一个电话号码" num = re.sub(r'\D', "", phone) # 移除非数字字符 print("电话号码 :", num)
输出为“2004959559”,通过
r'\D'
匹配非数字字符并替换为空。
这些示例体现了 re
模块的灵活性,适合各种字符串处理任务。
正则表达式语法详解
正则表达式的核心在于其语法规则,定义了如何描述匹配模式。以下是基本语法总结,基于官方文档 正则表达式指南:
类别 | 详情 | 示例 |
---|---|---|
匹配字符 | - 普通字母和符号直接匹配自身(如 test 匹配“test”)。- 特殊元字符:`. ^ $ * + ? { } [ ] \ | ( )(共 12 个,含义后续讨论)。<br>- 字符类 [ ]: [abc] 匹配 'a'、'b' 或 'c'; [a-z] 匹配小写字母。<br>- 否定: [^5]匹配除 '5' 外的任意字符。<br>- 转义:用 ` 转义元字符,如 \[ 匹配 ‘[’。- 预定义集: \d ([0-9])、\D ([^0-9])、\s ([ \t\n\r\f\v])、\S ([^ \t\n\r\f\v])、\w ([a-zA-Z0-9_])、\W ([^a-zA-Z0-9_])。- . 匹配除换行外的任意字符,re.DOTALL 标志可包含换行(详见 re.DOTALL)。 |
重复 | - * :零或多次,贪婪匹配(如 ca*t 匹配“ct”、“cat”、“caaat”)。- + :一次或多次(如 ca+t 匹配“cat”、“caaat”,不匹配“ct”)。- ? :零或一次,使可选(如 home-?brew 匹配“homebrew”或“home-brew”)。- {m,n} :至少 m 次,至多 n 次(如 a/{1,3}b 匹配“a/b”、“a//b”、“a///b”)。- 简写: {0,} = * ,{1,} = + ,{0,1} = ? 。 | ca*t , ca+t , home-?brew , a/{1,3}b |
这些规则构成了正则表达式的核心,结合 re
模块函数可实现复杂匹配。例如,r'\d+'
匹配一个或多个数字,r'[a-z]+'
匹配连续的小写字母。
高级应用与注意事项
对于高级用户,re
模块支持编译正则表达式对象以提高效率。例如:
pattern = re.compile(r'\d+')
result = pattern.search("Hello 123")
编译后可重复使用,适合处理大量数据。此外,文档提到正则表达式会被编译为字节码,由 C 语言编写的匹配引擎执行,优化可能涉及调整模式以生成更快的字节码,但本文不深入探讨优化细节。
需要注意的还有反斜杠处理问题。由于 Python 字符串字面值和正则表达式均使用反斜杠,建议始终使用原始字符串(如 r"text"
),避免转义冲突。例如,r"\n"
表示 '\'
和 'n'
,而 "\n"
表示换行符。
资源与进一步学习
为帮助用户深入学习,以下是推荐的权威资源:
- 官方文档 re — 正则表达式操作 提供全面的函数参考和语法说明。
- 教程 正则表达式指南 以更平易的方式介绍正则表达式使用,适合初学者。
- 在线教程如 [Python3 正则表达式 提供示例和实践指导,适合中文用户。
这些资源涵盖理论和实践,适合不同水平的用户探索正则表达式的更多功能。
总结
Python 3 的 re
模块为正则表达式提供了强大支持,通过简单函数和灵活语法,用户可轻松实现字符串匹配、替换和提取等任务。结合示例和官方文档,用户可快速上手并深入学习,满足各种开发需求。