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读写Excel文件方法介绍
Nov 22 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
python 以16进制打印输出的方法
Jul 09 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python opencv 图像拼接的实现方法
Jun 27 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
利用Python复制文件的9种方法总结
Sep 02 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
python flask框架快速入门
May 14 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 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中Date()时间日期函数的使用方法小结
2011/04/20 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
php实现微信发红包功能
2018/07/13 PHP
php时间戳转换代码详解
2019/08/04 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
js实现右键菜单功能
2016/11/28 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
Python CSV模块使用实例
2015/04/09 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
彻底搞懂Python字符编码
2018/01/23 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
详解Python绘图Turtle库
2019/10/12 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python如何实现DES加密
2020/09/21 Python
聊城大学毕业生自荐书
2014/02/01 职场文书
公证委托书大全
2014/04/04 职场文书
护理目标管理责任书
2014/07/25 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
创业计划书之熟食店
2019/10/16 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书