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 24 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
python对csv文件追加写入列的方法
Aug 01 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
Flask中endpoint的理解(小结)
Dec 11 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
python 调用API接口 获取和解析 Json数据
Sep 28 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简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
JavaScript类的写法
2016/09/17 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
JS实现简易计算器
2020/02/14 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
复制粘贴功能的Python程序
2008/04/04 Python
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
python3下pygame如何实现显示中文
2020/01/11 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
物业管理应届生求职信
2013/10/28 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers