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中使用wxPython开发的一个简易笔记本程序实例
Feb 08 Python
Python记录详细调用堆栈日志的方法
May 05 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
Python对象属性自动更新操作示例
Jun 15 Python
详解TensorFlow查看ckpt中变量的几种方法
Jun 19 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
基于flask实现五子棋小游戏
May 25 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 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
从Python程序中访问Java类的简单示例
2015/04/20 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
就业推荐表自我鉴定
2013/10/29 职场文书
日语专业毕业生求职信
2013/12/04 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
网络宣传方案
2014/03/15 职场文书
小学生环保标语
2014/06/13 职场文书
幼儿园见习总结
2015/06/23 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server