ZetCode

Python re.sub() 函数

最后修改于 2025 年 4 月 20 日

re.sub 简介

re.sub 函数是 Python 的 re 模块中一个强大的工具,用于使用正则表达式执行替换。它在字符串中搜索模式,并将它们替换为指定的文本。

此函数对于文本处理任务(如数据清理、格式化和转换)至关重要。它比简单的字符串替换方法提供了更大的灵活性。

re.sub 可以使用字面量替换和回调函数进行动态替换。它支持标志来修改匹配行为,并且可以在替换中引用匹配的组。

基本语法

re.sub 的基本语法有三个必需参数

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

pattern 是要匹配的正则表达式。repl 是替换字符串。string 是要处理的输入文本。

可选的 count 限制替换次数。flags 修改匹配行为。该函数返回修改后的字符串。

基本文本替换

让我们从一个简单的例子开始,替换句子中的颜色。

basic_sub.py
#!/usr/bin/python

import re

text = "The sky is blue and the grass is green"
result = re.sub(r'blue', 'gray', text)

print(result)

这会将输入文本中所有出现的 'blue' 替换为 'gray'。默认情况下,替换区分大小写。

result = re.sub(r'blue', 'gray', text)

第一个参数是要匹配的模式。第二个是替换字符串。第三个是要处理的文本。

使用正则表达式模式

当使用正则表达式模式进行匹配时,re.sub 会更加出色。

regex_pattern.py
#!/usr/bin/python

import re

text = "Order 12345 shipped, Order 67890 processing"
result = re.sub(r'Order \d+', 'Order XXXX', text)

print(result)

这会将所有订单号替换为 'XXXX'。\d+ 模式匹配一个或多个数字。

该示例演示了正则表达式模式如何匹配可变文本以实现一致的替换。

引用匹配的组

我们可以在替换字符串中引用匹配的组。

group_reference.py
#!/usr/bin/python

import re

text = "2023-04-20"
result = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)

print(result)

这会将日期从 YYYY-MM-DD 重新格式化为 MM/DD/YYYY。圆括号创建捕获组,引用为 \1\2 等。

r'(\d{4})-(\d{2})-(\d{2})'

该模式将年、月和日捕获为单独的组。每个 \d 匹配一个数字,其中 {n} 指定数量。

使用替换函数

对于动态替换,我们可以使用回调函数。

callback_function.py
#!/usr/bin/python

import re

def double_match(match):
    return str(int(match.group()) * 2)

text = "Scores: 10, 20, 30"
result = re.sub(r'\d+', double_match, text)

print(result)

这将使文本中的所有数字翻倍。回调接收一个匹配对象并返回替换字符串。

函数方法可以根据匹配的内容进行复杂的转换。它比静态替换字符串更灵活。

使用 Count 限制替换

count 参数限制了发生替换的次数。

count_parameter.py
#!/usr/bin/python

import re

text = "apple apple apple apple"
result = re.sub(r'apple', 'orange', text, count=2)

print(result)

这仅替换前两个出现的 'apple'。其余的匹配保持不变。

当您想要部分替换或仅处理某些匹配项时,控制替换计数非常有用。

不区分大小写的替换

re.IGNORECASE 这样的标志修改匹配行为。

case_insensitive.py
#!/usr/bin/python

import re

text = "Python is GREAT, really great!"
result = re.sub(r'great', 'awesome', text, flags=re.IGNORECASE)

print(result)

这会将 'great' 的所有大小写变体替换为 'awesome'。该标志使匹配不区分大小写。

当需要同时使用多种行为时,可以使用按位 OR (|) 组合标志。

高级:交换单词

这是一个更复杂的例子,交换单词位置。

word_swap.py
#!/usr/bin/python

import re

text = "John Doe, Jane Smith, Mike Johnson"
result = re.sub(r'(\w+) (\w+)', r'\2, \1', text)

print(result)

这将交换名字和姓氏,并在它们之间添加逗号。\w+ 模式匹配单词字符。

该示例展示了正则表达式组如何以强大的方式重构文本。这种技术对于数据重新格式化非常有用。

最佳实践

使用 re.sub 时,请考虑以下最佳实践

性能注意事项

re.sub 的性能取决于模式复杂性和输入大小。小文本上的简单模式速度很快,而大文本上的复杂模式可能需要优化。

对于重复的替换,使用 re.compile 预编译模式可以提高性能。尽可能避免不必要的捕获组。

来源

Python re.sub() 文档

本教程涵盖了 Python 的 re.sub 函数的各个方面。掌握模式替换将大大增强您的文本处理能力。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程