当前位置: 首页 > news >正文

Python 3.12 Std_Libs - String - 06 - 前缀和后缀

Python 3.12 Std_Libs - String - 前缀和后缀


在字符串处理中,检查字符串是否以某个前缀或后缀开头/结尾,以及安全地删除这些前缀/后缀,是极为常见的操作。Python 的str类型提供了四个专门的方法:startswith()endswith()removeprefix()removesuffix()。此外,标准库string模块中的Template类在某些场景下也与前缀处理相关,而stringprep模块则用于规范化字符串以实现可靠的前缀匹配。本文将从内置方法入手,剖析 CPython 的底层实现,横向对比string模块的辅助功能,并介绍stringprep对国际化字符串前缀匹配的影响。通过大量示例和性能分析,帮助您全面掌握字符串前缀与后缀处理的最佳实践。


一、内置前缀后缀方法概览

方法描述返回值是否修改原字符串
str.startswith(prefix[, start[, end]])检查字符串是否以指定前缀开头。prefix可以是字符串或元组。bool否(只读)
str.endswith(suffix[, start[, end]])检查字符串是否以指定后缀结尾。suffix可以是字符串或元组。bool
str.removeprefix(prefix)如果字符串以prefix开头,返回删除该前缀后的新字符串;否则返回原字符串。str是(返回新字符串)
str.removesuffix(suffix)如果字符串以suffix结尾,返回删除该后缀后的新字符串;否则返回原字符串。str

这四个方法共同构成了 Python 中处理前缀和后缀的完整工具链。


二、startswith()方法详解

2.1 基本语法与参数

str.startswith(prefix[,start[,end]])
  • prefix:字符串或包含多个前缀的元组。如果提供元组,只要字符串以其中任意一个前缀开头,即返回True
  • startend:可选,用于指定检查的起始和结束位置(切片语义,左闭右开)。

如果指定了startendstartswith会先对字符串进行切片(不创建新对象,只是内部偏移),然后检查该子串的前缀。

2.2 基本示例

s="hello world"print(s.startswith("hello"))# Trueprint(s.startswith("world"))# Falseprint(s.startswith(("hello","hi")))# True(元组匹配)print(s.startswith("he",0,2))# True(检查索引 0-2 的子串 "he")

2.3 底层实现(CPython)

startswith的 C 实现位于Objects/unicodeobject.c中的unicode_startswith函数。其核心流程如下:

  1. 解析参数:获取prefixstartend。如果prefix是元组,则依次遍历元组中的每个子串。
  2. 范围裁剪:将startend参数规范化(处理负数、超出边界)。如果start >= end或该范围长度小于前缀长度,直接返回False
  3. 对于非元组前缀:调用内部函数_PyUnicode_Tailmatch(该函数也用于endswithfind的尾部匹配)。_PyUnicode_Tailmatch根据direction参数(-1表示尾部,1表示头部)决定扫描方向。
    • 检查前缀时,算法很简单:比较指定范围内的字符串的起始部分是否与prefix完全相同。采用memcmp(对于紧凑表示的 Unicode 字符串)或逐字符比较。
  4. 如果prefix是元组,则依次匹配每个元素,一旦有一个成功就返回True,否则False
  5. 返回TrueFalse

性能特点

  • 单前缀匹配:时间复杂度 O(k),其中 k 为前缀长度(只需比较 k 个字符)。
  • 元组前缀:最坏 O(m * k),m 为元组中前缀个数,k 为平均前缀长度。但 Python 会短路,一旦找到匹配即停止。
  • 由于不产生新字符串(只使用偏移),内存开销极小。

2.4 高级技巧:高效检查多个前缀

当需要检查是否以多个可能前缀之一开始时,优先使用元组,而不是多次调用startswith或使用or

# 不推荐ifs.startswith("http:")ors.startswith("https:")ors.startswith("ftp:"):pass# 推荐ifs.startswith(("http:","https:","ftp:")):pass

元组版本在 C 层完成循环,开销远小于多次 Python 函数调用。

2.5 与切片配合使用

url="https://example.com/path"ifurl.startswith(("http://","https://"),0,8):# 检查前 8 个字符print(<
http://www.jsqmd.com/news/819550/

相关文章:

  • RepoDB类处理器高级用法:实现复杂业务逻辑的优雅解决方案
  • React Native Navigation终极升级指南:从旧版本平滑迁移到最新版本的10个关键步骤 [特殊字符]
  • 71.人工智能实战:RAG 权限过滤怎么做?从前期发现“越权召回”到文档 ACL、检索过滤与引用权限校验
  • 嵌入式开发中CircuitPython单精度浮点数精度解析与优化策略
  • 终极指南:如何用apt-offline在无网环境下管理Debian软件包
  • 如何用AML模组管理器打造专属XCOM游戏体验:新手完整指南
  • 【Midjourney商业设计变现指南】:20个已验证的高转化落地场景与客户签约话术库
  • AI编程伙伴Cursor高效使用指南:从提示词工程到实战工作流
  • 用 RSUSR040 评估 SAP 授权对象,让权限治理从经验判断走向可检索、可复核、可审计
  • 全网最全的彩虹云商城系统源码以及各类发卡网源码,绝对精品
  • 如何利用AKShare金融数据接口探索量子计算在投资分析中的应用前景
  • PearProject性能优化技巧:让你的协作系统运行更加流畅
  • 突破性解决方案:Noto Emoji如何彻底终结表情符号乱码问题
  • 从 SUIM 到 ABAP 代码,重新理解 SAP 授权评估里的 RSUSR030
  • 【空间计算】【复杂系统】运动几何及运动测量
  • Djot表格制作教程:简单创建专业级数据展示
  • RepoDB批量操作完全指南:如何高效处理百万级数据
  • C++面向对象编程核心概念与实践:从封装、继承到多态与设计模式
  • Express-Generator命令行选项详解:10个实用技巧快速提升开发效率
  • Rust 社区在 4 月做了什么:项目管理月报解读
  • Claude Code 用户遭遇封号或额度不足时转向 Taotoken 的平滑迁移方案
  • 终极指南:如何在Sketch中快速创建动画 - AnimateMate完整教程
  • 数字电路设计避坑指南:Verilog写Testbench时,你的fork-join和initial用对了吗?
  • NBK联轴器经销商哪家好?NBK特殊螺丝经销商哪家好?2026特殊螺丝定制厂家推荐参考 - 栗子测评
  • 杭州森之井电子科技2026专业控湿厂家甄选:吊顶除湿机/工业加湿机/低温除湿机/森井家用除湿机/医院专用除湿加湿一体机厂 - 栗子测评
  • AGIAgent开源框架:构建会思考与协作的AI智能体
  • FT232H芯片应用指南:从USB转串口到SPI/I2C协议模拟
  • 工业4.0系统.htaccess配置:智能制造网络优化终极指南 [特殊字符]
  • 如何为MPC-HC打造终极影音体验:从零开始的完整配置指南
  • WCH USB Host CherryUSB 移植实战:从寄存器差异到中断驱动的全流程解析