Python 3.12 Std_Libs - String - 02 - 查找与替换

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

Python 3.12 Std_Libs - String - Find_Replace


字符串查找与替换是文本处理的核心任务,从简单的子串搜索到复杂的模板替换,Python 提供了丰富且高效的工具。本文将从内置 str 类型的查找与替换方法入手,深入分析其底层 CPython 实现原理,横向对比 string 模块中的模板替换机制,并对国际化字符串准备模块 stringprep 中的相关功能进行解析。最后通过多个实战示例,展示如何在不同场景下选择最合适的查找与替换方案,以达到性能与可读性的最佳平衡。


一、str 类型内置的查找方法

查找方法用于定位子串在字符串中的位置或统计出现次数。这些方法都是只读操作,不改变原字符串。它们大致可分为两类:返回索引的方法(findrfindindexrindex)和统计方法(count)。

1.1 find()rfind() – 安全查找子串位置

find(sub[, start[, end]]) 返回子串 sub 在字符串中第一次出现的索引,若未找到则返回 -1rfind() 从右侧开始查找最后一次出现的索引。

基本用法

s = "hello world, hello python"
print(s.find("hello"))     # 0
print(s.rfind("hello"))    # 13
print(s.find("good"))      # -1

参数说明

  • startend 用于限制搜索范围(切片语义,左闭右开)。
  • 支持负数索引,表示从末尾计数。

底层实现(CPython)
findrfind 底层调用 PyUnicode_Find 函数。该函数根据是否正向或反向选择使用 PyUnicode_FindCharPyUnicode_Find。搜索算法采用快速 Two-Way 算法(Crochemore & Perrin)结合 Bloom Filter 优化,时间复杂度为 O(n)。对于单字符子串,会调用 memchr 等底层 C 函数加速。

设计细节

  • 对于空子串 ""find 返回 start(或 0),这是因为空串被视为在任何位置都存在。这是符合直觉的。
  • 性能:当字符串长度很大且子串较短时,Python 会启用内建优化,避免逐个字符扫描。

1.2 index()rindex() – 查找失败时抛出异常

index()find() 功能相同,但若子串不存在,则引发 ValueErrorrindex() 对应 rfind()

示例

s = "hello world"
print(s.index("world"))   # 6
# print(s.index("good"))  # ValueError: substring not found

使用建议:当确信子串存在时用 index(),可避免多余的 -1 判断;否则用 find()

底层index 内部调用与 find 相同的查找函数,只是在返回 -1 时转换为异常。

1.3 count() – 统计子串出现次数

count(sub[, start[, end]]) 返回非重叠子串出现的次数。

示例

s = "ababa"
print(s.count("aba"))   # 1 (重叠子串只计算一次)
print(s.count("ab"))    # 2

底层实现:与查找算法类似,使用 Two-Way 算法统计不重叠的匹配次数。

性能提示

  • 对于单字符统计,使用 s.count('a') 非常高效,因为内部会直接遍历字符。
  • 若需统计多个字符的情况,可考虑使用

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AsDuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值