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 修改匹配行为。该函数返回修改后的字符串。
基本文本替换
让我们从一个简单的例子开始,替换句子中的颜色。
#!/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 会更加出色。
#!/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+ 模式匹配一个或多个数字。
该示例演示了正则表达式模式如何匹配可变文本以实现一致的替换。
引用匹配的组
我们可以在替换字符串中引用匹配的组。
#!/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} 指定数量。
使用替换函数
对于动态替换,我们可以使用回调函数。
#!/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 参数限制了发生替换的次数。
#!/usr/bin/python import re text = "apple apple apple apple" result = re.sub(r'apple', 'orange', text, count=2) print(result)
这仅替换前两个出现的 'apple'。其余的匹配保持不变。
当您想要部分替换或仅处理某些匹配项时,控制替换计数非常有用。
不区分大小写的替换
像 re.IGNORECASE 这样的标志修改匹配行为。
#!/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 (|) 组合标志。
高级:交换单词
这是一个更复杂的例子,交换单词位置。
#!/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 时,请考虑以下最佳实践
- 使用原始字符串 (
r'') 作为模式以避免转义问题 - 如果经常重复使用,请使用
re.compile预编译模式 - 使用特定模式以避免意外匹配
- 使用回调函数进行复杂的替换逻辑
- 使用各种输入案例彻底测试模式
性能注意事项
re.sub 的性能取决于模式复杂性和输入大小。小文本上的简单模式速度很快,而大文本上的复杂模式可能需要优化。
对于重复的替换,使用 re.compile 预编译模式可以提高性能。尽可能避免不必要的捕获组。
来源
本教程涵盖了 Python 的 re.sub 函数的各个方面。掌握模式替换将大大增强您的文本处理能力。
作者
列出所有 Python 教程。