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 20 Python
python中reload(module)的用法示例详解
Sep 15 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
Python常见的pandas用法demo示例
Mar 16 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
django 扩展user用户字段inlines方式
Mar 30 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
解决python对齐错误的方法
Jul 16 Python
scrapy实践之翻页爬取的实现
Jan 05 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的memcached客户端memcached
2011/06/14 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
详解React之key的使用和实践
2018/09/29 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
初任培训自我鉴定
2013/10/07 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android