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中xrange用法分析
Apr 15 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
PyInstaller的安装和使用的详细步骤
Jun 02 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短域名转换为实际域名函数
2011/01/17 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
php curl选项列表(超详细)
2013/07/01 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
学习YUI.Ext基础第一天
2007/03/10 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
个人求职信范例
2014/01/29 职场文书
医院院务公开实施方案
2014/05/03 职场文书
市场部岗位职责
2015/02/12 职场文书
老乡聚会通知
2015/04/23 职场文书
Java 写一个简单的图书管理系统
2022/04/26 Java/Android