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 urls.py的三种配置写法实例详解
Apr 28 Python
python生成词云的实现方法(推荐)
Jun 13 Python
Python如何实现MySQL实例初始化详解
Nov 06 Python
python中验证码连通域分割的方法详解
Jun 04 Python
【python】matplotlib动态显示详解
Apr 11 Python
python向字符串中添加元素的实例方法
Jun 28 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
python 回溯法模板详解
Feb 26 Python
Python基础类继承重写实现原理解析
Apr 03 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
matplotlib相关系统目录获取方式小结
Feb 03 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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
JsDom 编程小结
2011/08/09 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
python中urlparse模块介绍与使用示例
2017/11/19 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
详解Python模块化编程与装饰器
2021/01/16 Python
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
合作协议书
2014/04/23 职场文书
小学生成绩单评语
2014/12/31 职场文书
降价通知函
2015/04/23 职场文书
公积金贷款承诺书
2015/04/30 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript