Python查找第n个子串的技巧分享


Posted in Python onJune 27, 2018

Problem

Python中str类自带的find、index方法可以返回第一个匹配的子串的位置,但是如果实际使用中需要查找第2个甚至第n个子串的位置该怎么办呢。也许有的码友可能会用到第二第三个参数,指定查找的起始、终止位置。但是在很多情况下,接收到的一个字符串可能是未知的,强制限定起始位置可能导致代码在某些情况下不能适用。

Solution

采用嵌套的方法调用find或者index。

str_exp = "aaabbbbccc"
 pos_n = str_exp.index("a", str_exp.index("a")+1)
 print(pos_n)

原理很简单,第一次查找返回的位置加1作为第二次查找的起始参数。加1是因为start参数位置是被包含的,采用的闭区间的语义。也不用担心会越界,python底层已经做了处理。

也可以写一个单独的函数来进行查找操作。

def find_n_sub_str(src, sub, pos, start):
 index = src.find(sub, start)
 if index != -1 and pos > 0:
  return find_n_sub_str(src, sub, pos - 1, index + 1)
 return index

pos表示第n个子串,从0开始。start为起始位置。此处使用find而不用index是因为index在查找失败时会报出异常,而find不报异常返回-1。从健壮性考虑使用find。

看来递归使用起来还是可以解决很多编程实践过程中遇到的工程问题。:)

Attention

1、左闭右开特性

str.index(self, sub, start=None, end=None)
str_tmp[start:end]

默认的是左闭右开,即包含start的位置,却不包含end的位置。在使用过程中需要注意一下。同样左闭右开的还有切片操作str_tmp[start:end]。

示例如下:

str_exp = "aaabbbbccc"
 print(str_exp)
 print(str_exp[str_exp.index("a"):str_exp.rindex("c")])
aaabbbbccc
aaabbbbcc

2、find与index差别

find是不会报出异常的,即查找子串失败的情况下返回-1,而index在查找子串失败时会报异常。

示例如下:

str_tmp = "aaaabbbbccccdddd"
 print(find_n_sub_str(str_tmp, "a", 5, 0))
 print(str_tmp.find("a", 7))
 print(str_tmp.index("a", 7))
-1
-1
Traceback (most recent call last):
 File "/usr/local/pycharm-community-5.0.4/helpers/pydev/pydevd.py", line 2411, in <module>
 globals = debugger.run(setup['file'], None, None, is_module)
 File "/usr/local/pycharm-community-5.0.4/helpers/pydev/pydevd.py", line 1802, in run
 launch(file, globals, locals) # execute the script
 File "/usr/local/pycharm-community-5.0.4/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
 exec(compile(contents+"\n", file, 'exec'), glob, loc) 
 File "/usr/local/workspace/pycharmPro/StockAI/StockAI/DbDealer.py", line 140, in <module>
 print(str_tmp.index("a", 7))
ValueError: substring not found

以上这篇Python查找第n个子串的技巧分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 数据加密代码
Dec 24 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
详解python开发环境搭建
Dec 16 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python文件操作基本流程代码实例
Dec 11 Python
python在文本开头插入一行的实例
May 02 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
python破解bilibili滑动验证码登录功能
Sep 11 Python
Python关于反射的实例代码分享
Feb 20 Python
Python实现UDP程序通信过程图解
May 15 Python
Python是什么 Python的用处
May 26 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 #Python
获取python的list中含有重复值的index方法
Jun 27 #Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 #Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 #Python
使用Python对微信好友进行数据分析
Jun 27 #Python
python实现列表中由数值查到索引的方法
Jun 27 #Python
numpy返回array中元素的index方法
Jun 27 #Python
You might like
4.与数据库的连接
2006/10/09 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
jquery中文乱码的多种解决方法
2013/06/21 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python自动zip压缩目录的方法
2015/06/28 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
浅谈Django的缓存机制
2018/08/23 Python
python频繁写入文件时提速的方法
2019/06/26 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
优秀生推荐信范文
2013/11/28 职场文书
预备党员表决心书
2014/03/11 职场文书
技校毕业生自荐书
2014/05/23 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL