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中文乱码的解决方法
Nov 04 Python
Python实现发送email的几种常用方法
Aug 18 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
名片管理系统python版
Jan 11 Python
python实现Windows电脑定时关机
Jun 20 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
python判断完全平方数的方法
Nov 13 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
python中selenium操作下拉滚动条的几种方法汇总
Jul 14 Python
django admin.py 外键,反向查询的实例
Jul 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
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
JS的反射问题
2010/04/07 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
Python计算程序运行时间的方法
2014/12/13 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
python中upper是做什么用的
2020/07/20 Python
python爬取youtube视频的示例代码
2021/03/03 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
党的群众路线专项整治方案
2014/11/03 职场文书
2014年电工工作总结
2014/11/20 职场文书
小学班主任个人总结
2015/03/03 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
家长通知书家长意见
2015/06/03 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
停车场管理制度范本
2015/08/05 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
详解NodeJS模块化
2021/06/15 NodeJs