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写的图片蜘蛛人代码
Aug 27 Python
python解析文件示例
Jan 23 Python
Python中的filter()函数的用法
Apr 27 Python
Python实现各种排序算法的代码示例总结
Dec 11 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
在pycharm中设置显示行数的方法
Jan 16 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
Python接口测试环境搭建过程详解
Jun 29 Python
Python操作MySQL数据库的示例代码
Jul 13 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
建站常用13种PHP开源CMS比较
2009/08/23 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
vue axios post发送复杂对象问题
2019/06/04 Javascript
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
python3 深浅copy对比详解
2019/08/12 Python
pycharm显示远程图片的实现
2019/11/04 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
聊聊python中的异常嵌套
2020/09/01 Python
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
高中生毕业学习总结的自我评价
2013/11/14 职场文书
高中班长自我鉴定
2013/12/20 职场文书
文明城市标语
2014/06/16 职场文书
要账委托书范本
2014/09/15 职场文书
2015高考寄语集锦
2015/02/27 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python
mysql left join快速转inner join的过程
2021/06/30 MySQL