Python 正则表达式核心用法与实战技巧
引言
正则表达式(Regular Expression,简称 Regex)是用于描述字符串模式的一套语法规则。在 Python 中,通过内置的 re 模块,开发者可以高效地进行文本搜索、替换、提取和验证。本文将系统介绍正则表达式的基础语法、常用函数及高级技巧,帮助读者掌握文本处理的核心能力。
本文介绍了 Python 正则表达式的基础语法、核心函数及高级技巧。内容涵盖元字符含义、findall/sub/match/search/split 等函数用法、分组捕获、标志位设置以及性能优化建议。通过实际代码示例展示了数据提取、文本替换、格式验证等常见场景的应用,旨在帮助开发者掌握高效的文本处理能力。

正则表达式(Regular Expression,简称 Regex)是用于描述字符串模式的一套语法规则。在 Python 中,通过内置的 re 模块,开发者可以高效地进行文本搜索、替换、提取和验证。本文将系统介绍正则表达式的基础语法、常用函数及高级技巧,帮助读者掌握文本处理的核心能力。
正则表达式由普通字符和特殊字符(元字符)组成。理解元字符的含义是使用正则的前提。
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配除换行符以外的任意单个字符 | a.c 匹配 abc |
^ | 匹配字符串开头 | ^Hello 匹配以 Hello 开头 |
$ | 匹配字符串结尾 | world$ 匹配以 world 结尾 |
* | 匹配前一个字符 0 次或多次 | ab*c 匹配 ac, abc, abbc |
+ | 匹配前一个字符 1 次或多次 | ab+c 匹配 abc, abbc |
? | 匹配前一个字符 0 次或 1 次 | colou?r 匹配 color 或 colour |
{n} | 精确匹配 n 次 | \d{3} 匹配 3 位数字 |
{n,} | 至少匹配 n 次 | \d{3,} 匹配 3 位及以上数字 |
[] | 字符集合,匹配其中任意一个 | [abc] 匹配 a, b 或 c |
[^] | 否定字符集合 | [^0-9] 匹配非数字字符 |
\d | 匹配任意数字,等价于 [0-9] | \d+ |
\D | 匹配任意非数字 | \D+ |
\w | 匹配字母、数字或下划线 | \w+ |
\W | 匹配非字母、数字或下划线 | \W+ |
\s | 匹配空白字符(空格、制表符等) | \s+ |
\S | 匹配非空白字符 | \S+ |
Python 的 re 模块提供了多个核心函数来处理正则表达式。
re.findall(pattern, string) 返回一个包含所有非重叠匹配的列表。
import re
text = "Contact us at [email protected] or [email protected]"
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(pattern, text)
print(emails)
# 输出:['[email protected]', '[email protected]']
re.sub(pattern, repl, string) 将匹配到的子串替换为指定内容。
import re
text = "There are 123 apples and 456 oranges."
pattern = r'\d+'
new_text = re.sub(pattern, '*', text)
print(new_text)
# 输出:'There are * apples and * oranges.'
re.match(pattern, string) 仅从字符串开头匹配。
re.search(pattern, string) 扫描整个字符串寻找第一个匹配。
import re
date = '2022-01-01'
pattern = r'\d{4}-\d{2}-\d{2}'
if re.match(pattern, date):
print('日期格式有效')
else:
print('日期格式无效')
re.split(pattern, string) 根据正则表达式分割字符串。
import re
text = "apple,banana;orange grape"
pattern = r'[;, ]+'
result = re.split(pattern, text)
print(result)
# 输出:['apple', 'banana', 'orange', 'grape']
分组允许我们将匹配的部分提取出来单独使用,这在数据清洗中非常有用。
使用圆括号 () 定义捕获组。match.groups() 返回所有捕获组的元组。
import re
pattern = r'(\d{4})-(\d{2})-(\d{2})'
date = '2022-01-01'
match = re.match(pattern, date)
if match:
year, month, day = match.groups()
print(f'年份:{year},月份:{month},日期:{day}')
else:
print('日期格式无效')
使用 (?P<name>...) 语法给组命名,便于后续引用。
import re
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
date = '2022-01-01'
match = re.match(pattern, date)
if match:
print(match.group('year'))
print(match.group('month'))
print(match.group('day'))
标志位用于修改正则表达式的匹配行为。
| 标志 | 说明 |
|---|---|
re.I / re.IGNORECASE | 忽略大小写 |
re.M / re.MULTILINE | 多行模式,^ 和 $ 匹配每行的开头结尾 |
re.S / re.DOTALL | 使 . 匹配包括换行符在内的所有字符 |
re.X / re.VERBOSE | 允许注释和空白,提高可读性 |
示例:忽略大小写匹配。
import re
text = "Python Programming"
pattern = r"python"
# 默认区分大小写,不匹配
print(re.search(pattern, text))
# 使用 IGNORECASE 标志
print(re.search(pattern, text, re.I))
re.compile() 创建 Pattern 对象,可提升性能。r'' 原始字符串,避免转义字符冲突。*?)以减少回溯开销。re.error,建议在关键逻辑中加入 try-except 块。import re
try:
pattern = re.compile(r'\d+')
result = pattern.findall("Test 123")
except re.error as e:
print(f"正则错误:{e}")
Python 的正则表达式功能强大且灵活。通过掌握基础元字符、核心函数以及分组技巧,开发者可以显著提升文本处理的效率。建议在实际项目中结合具体需求查阅官方文档,并注重代码的可读性与维护性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online