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中利用Pandas库处理大数据的简单介绍
Apr 07 Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
对Python协程之异步同步的区别详解
Feb 19 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Django视图扩展类知识点详解
Oct 25 Python
Python request操作步骤及代码实例
Apr 13 Python
使用Python实现批量ping操作方法
May 06 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
Python机器学习工具scikit-learn的使用笔记
Jan 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面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
查环查孕证明
2014/01/10 职场文书
学雷锋演讲稿
2014/03/04 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
设计师求职信模板
2014/05/06 职场文书
环保建议书300字
2014/05/14 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
交通事故代理词范文
2015/05/23 职场文书
关于运动会的广播稿
2015/08/19 职场文书
护理自荐信
2019/05/14 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis